当前位置: 首页 > 知识库问答 >
问题:

如何在样式中更改字体大小。使用ApachePOI的docx xml

燕超
2023-03-14

现在我有一个docx文件,我加载到XWPF文档

XWPFDocument doc = new XWPFDocument(InputStream)

我可以看到存储在style中的不同样式的当前字体大小。通过做xml

for (CTStyle ctstyle : doc.getStyle().getStyleList())
{
    if (ctstyle.isSetRPr())
    {
        if (ctstyle.getRPr().isSetSz())
        {
            CTHpsMeasure size = ctstyle.getRPr().getSz();
            System.out.println(size.getVal());
        }
    }
}

我想用poi更新字体大小,所以我试了一下

for (CTStyle ctstyle : doc.getStyle().getStyleList())
{
    if (ctstyle.isSetRPr())
    {
        if (ctstyle.getRPr().isSetSz())
        {
            CTHpsMeasure size = ctstyle.getRPr().getSz();
            size.setVal(BigInteger.valueOf(12));
            ctstyle.getRPr().setSz(size);
        }
    }
}

但是,在完成上述代码后,如果我使用第一段代码检查文档的字体大小(XWPFDocument docobject),字体大小仍然是原始值,而不是我想要设置的12。

对于如何解决这个问题,有什么建议吗?

共有1个答案

戚建德
2023-03-14

XWPFDocument.get样式获取org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyles,但不获取文档部分/word/styles.xml。因此,在编写XWPF文档时,不会提交此CTStyles中的更改。

XWPFDocument。getStyles获取XWPFStyles,它扩展了POIXMLDocumentPart并覆盖了commit方法。因此,在编写XWPFDocument时,将提交此XWPFStyles中的更改。

不幸的是,没有一种方法可以从这个XWPFStyles中获得所有单一的样式。有一个字段私有CTStyles ctStyles,它也是在保护无效提交()中提交的,但不能公开访问。所以我使用反射来获得它。

从您之前的问题中,我知道您在解析*. docx文件时遇到了问题,该文件的字体大小错误地设置为双

ctstyle.getRPr(). getSz()工作没有崩溃也有

此外,您还应该获得并更正ctstyle。getRPr()。getSzCs(),这是所使用的“复杂脚本”字体的大小,也可能是错误的。

以下内容适用于我,之后所有字体大小的样式都设置了整数字体大小。例如

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.xwpf.usermodel.*;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyle;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyles;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHpsMeasure;

import java.math.BigInteger;
import java.math.BigDecimal;

import java.lang.reflect.Field;

public class WordChangeStyles {

 public static void main(String[] args) throws Exception {

  XWPFDocument document = new XWPFDocument(new FileInputStream("WordUsingStyles.docx"));

  XWPFStyles styles = document.getStyles(); //XWPFStyles extends POIXMLDocumentPart and overwrites commit method
  Field _ctStyles = XWPFStyles.class.getDeclaredField("ctStyles");
  _ctStyles.setAccessible(true); 
  CTStyles ctStyles = (CTStyles)_ctStyles.get(styles);

  CTHpsMeasure size;
  String sz;
  for (CTStyle ctstyle : ctStyles.getStyleList()) {
   if (ctstyle.isSetRPr()) {
    if (ctstyle.getRPr().isSetSz()) {
     size = ctstyle.getRPr().getSz();
     if (size != null) {
      sz = size.selectAttribute("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "val").newCursor().getTextValue();
      System.out.println(sz); //here you could get the real meant size out of
      size.setVal(new BigDecimal(sz).toBigInteger()); //sets the sz got from size truncated to BigInteger
      ctstyle.getRPr().setSz(size); //after that the font size should be integer

      System.out.println(ctstyle.getRPr().getSz().getVal());
     }

     size = ctstyle.getRPr().getSzCs();
     if (size != null) {
      sz = size.selectAttribute("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "val").newCursor().getTextValue();
      System.out.println(sz); //here you could get the real meant size out of
      size.setVal(new BigDecimal(sz).toBigInteger()); //sets the sz got from size truncated to BigInteger
      ctstyle.getRPr().setSzCs(size); //after that the font size should be integer

      System.out.println(ctstyle.getRPr().getSzCs().getVal());
     }
    }
   }
  } 

  document.write(new FileOutputStream("WordUsingStyles.docx")); //while writing out XWPFStyles will be committed
  document.close();
 }
}

 类似资料:
  • 所以我开始了一个个人简历网站,我偶然发现了一个非常酷的东西:font awesome,它以文本的形式提供图形,允许你通过CSS添加字体效果。我的问题是一切都很好,直到我试图改变字体大小,无论什么原因,它就是不会改变。你有什么想法吗?我也是新的这里,我已经阅读通过如何使帖子,但如果我做错了,请让我知道。

  • 问题内容: 我是Vala / Gtk的新手,我正在尝试更改Gtk.Label的字体大小,但是我找不到一种好的方法。 我发现我可以像这样使用标记: 但这似乎有点骇人听闻。正确的做法是什么? 问题答案: 您可以尝试使用CSS,我认为最近这是首选方法。给您的标签一个类,然后加载一个CSS。如果您要更改标签的字体大小,我敢打赌您也将自定义其他内容,因此CSS可能对您有用。

  • 问题内容: 如何增加字体大小? 问题答案: 其中fontSize是一个int。drawString的API指出x和y参数是坐标,与文本的大小无关。

  • 除了这个问题:更改超文本标记语言电子邮件正文字体类型和大小在VBA,我想知道如何才能改变字体大小 当我从代码中删除字体大小时,它确实改变了字体系列。 谢谢你的协助,

  • 我有一个java应用程序-一个计算器。我想通过调整应用程序窗口的大小来动态调整按钮的字体大小。如何实现? 我的想法是使用ComponentEvents。我有应用程序窗口的初始大小和初始字体的大小。我想根据按钮的大小改变字体大小,受窗口大小变化的影响。问题是如何在覆盖方法中使用比例[初始窗口大小]/[初始字体大小]?每个字体的比例都不同。

  • 问题内容: 您可以更改JOptionPane的字体和文本大小吗?我尝试了它,只有当我在那个特定的Java类上“运行文件”时,它才起作用。如果启动整个项目,则不会更改字体。我只想更改一个特定的JOptionPane而不是全部。 这是代码: 问题答案: 真的很简单。JOption窗格不仅接受字符串,还接受组件。因此,您可以创建一个标签集并设置其字体并将其用作消息。 我不明白为什么以前没人回答这个问题