java使用Spire.Doc生成的word文件去除水印(头部的警告信息)

1.需求

通过word模板和库表中数据动态生成word文档。

word操作工具本身自带word转xml(直接另存为xml即可)。

但是需求明确了,只能用word模板,也不允许用户手动从word转xml再上传。

数据动态生成使用了freemark,freemark需要一个xml或flt文件,所以结合上边的不能传xml的需求,我将word模板使用Spire.Doc将word模板转xml,在使用freemark进行xml的动态解析完成了任务

2.问题

在使用Spire.Doc的word文档产生了警告水印

(Evaluation Warning: The document was created with Spire.Doc for JAVA.)

3.问题解决

        3.1. 我是先从网上找方案但是我使用第一种方法直接报错,也没找到报错原因,直接放弃,第二种因为得换包并且有长度限制,直接放弃

方法一:

  //重新读取生成的文档    
  InputStream is = new FileInputStream("E:\\demo.docx");
        XWPFDocument document = new XWPFDocument(is);
        //以上Spire.Doc 生成的文件会自带警告信息,这里来删除Spire.Doc 的警告
        document.removeBodyElement(0);
        //输出word内容文件流,新输出路径位置
        OutputStream os=new FileOutputStream("E:\\demo1.docx");
        try {
            document.write(os);
            System.out.println("生成docx文档成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }
方法二:

用free spire.Doc for Java这个是免费版,有一定限制, 导出的时候可生成的段落不能超过固定的数量,但是导出来的Word是没有警告信息的,商业版的spire.Doc for Java才会有警告信息
————————————————
版权声明:本文为优快云博主「一纸的空白」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_33745005/article/details/108140983

        3.2. 下面是我的解决方案

我首先想到的是解析每一行的word成数组,然后将第一行元素删除掉并且将数据输出到新的文件(我在思考word文档的格式问题怎么解决,但是我决定先试一下),当我解析出来以后我发现word文档输出出来是一行xml。于是我想到了新的解决方式:将xml中的警告直接用空字符串替换掉在输出,贴代码

下面方法我是直接对生成的word进行操作的,也可以在word转xml时直接对xml进行操作,原理和方法完全一样

//这里是根据解析出的xml抽取出的警告水印的样式及其xml标签,方便下面替换用
//如果这里只是替换文字的话会有空行,所以直接将整个标签替换
private final String WARN = "<w:p><w:pPr /><w:r><w:rPr><w:color w:val=\"FF0000\" /><w:sz w:val=\"24\" /></w:rPr><w:t xml:space=\"preserve\">Evaluation Warning: The document was created with Spire.Doc for JAVA.</w:t></w:r></w:p>";


//原文件
String docName = fileName + uuid + ".doc";
File file = new File(docPath);
/**
 * 消除警告开始
 * 创建解析对象,注意这里的包是cn.hutool.core.io.file.FileReader
 * 因为这里使用jdk自带的java.io.FileReader时候解析出的xml不全
 */
FileReader fileReader = new FileReader(file);
String str = fileReader.readString();
//替换
str = str.replaceAll(WARN,"");
//输出,这里的包我就直接用的java.io,用hutool也没问题
FileWriter fileWriter = new FileWriter(file);
fileWriter.write(str);//消除警告结束

下面是word转xml

//这里的包是com.spire.doc.Document
Document doc = new Document();
doc.loadFromStream(inputStream, FileFormat.Doc);
doc.saveToFile(xmlPath, FileFormat.Word_Xml);
doc.dispose();

使用到的jar包 pom

    <repositories>
        <repository>
            <id>com.e-iceblue</id>
            <url>http://repo.e-iceblue.cn/repository/maven-public/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>e-iceblue</groupId>
            <artifactId>spire.doc</artifactId>
            <version>3.7.2</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.19</version>
        </dependency>
    </dependencies>

4.总结

word的本质其实是xml,这应该也是word存储样式的本质。

喜欢记得关注点赞~

转载请注明出处哦~

<think>好的,我现在需要帮助用户解决如何使用JavaSpire.Doc库读取Word文档中的表格并设置单元格中字体的颜色。首先,我需要回忆Spire.Doc的相关文档和API。 用户提到的是读取表格和设置字体颜色,所以重点在表格操作和样式设置上。根据之前的引用内容,Spire.Doc可以处理Word文档的转换,但用户现在需要的是读取表格并修改样式。 首先,我需要确定如何加载Word文档。根据示例代码,使用Document类加载文件,比如`Document doc = new Document("input.docx");`。这部分应该是正确的。 接下来,要获取文档中的表格。Spire.Doc中,文档的结构通常通过Sections、Body、Tables来组织。可能需要遍历每个Section,然后在每个Section中获取Tables集合。例如,`Section section = doc.getSections().get(0);`获取第一个节,然后`Table table = section.getTables().get(0);`获取第一个表格。 然后,处理单元格。每个表格由行和列组成,需要遍历行和列来访问具体的单元格。例如,使用循环遍历每个TableRow和TableCell。例如,`TableRow row = table.getRows().get(i);`然后`TableCell cell = row.getCells().get(j);`。 接下来是设置字体颜色。在Spire.Doc中,文本内容可能在Paragraph中,而字体样式通过TextRange或Paragraph的Style来设置。需要获取单元格中的段落,然后获取段落中的文本范围,设置颜色。例如,`Paragraph para = cell.getParagraphs().get(0);`然后`TextRange text = para.getTextRanges().get(0);`,再调用`text.getCharacterFormat().setTextColor(Color.red);`。 需要注意,如果单元格中有多个段落或多个文本范围,可能需要遍历处理。此外,保存文档时使用`doc.saveToFile("output.docx", FileFormat.Docx);`。 现在,检查是否有遗漏的步骤,比如是否需要处理嵌套表格,或者是否需要先读取内容再修改。用户的需求是读取表格并设置颜色,所以示例代码应该覆盖这些步骤。 可能的问题点:Spire.Doc的API是否正确,例如获取表格的方式是否正确,设置颜色的方法是否存在。需要确认API文档中的方法名和参数。例如,`getTextRanges()`是否正确,或者是否有其他方式获取文本内容。 另外,颜色设置可能需要使用特定的Color类,比如Java的`java.awt.Color`或者Spire.Doc自带的颜色枚举。需要确认示例中使用的是正确的类,可能需要导入相应的包。 最后,生成相关问题,需要考虑用户可能进一步的需求,比如处理特定单元格、合并单元格,或者处理其他样式如字体大小、加粗等。还可能涉及性能优化或异常处理的问题。</think>以下是使用Spire.Doc for Java操作Word表格的完整实现步骤: ### 1. 添加依赖 确保已引入Spire.Doc库: ```xml <dependency> <groupId>e-iceblue</groupId> <artifactId>spire.doc</artifactId> <version>12.5.1</version> </dependency> ``` ### 2. 读取表格并设置字体颜色 ```java import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.TextRange; import java.awt.*; public class WordTableStyling { public static void main(String[] args) { // 加载文档 Document doc = new Document("input.docx"); // 获取第一个表格 Section section = doc.getSections().get(0); Table table = (Table) section.getTables().get(0); // 遍历表格行列 for (int i = 0; i < table.getRows().getCount(); i++) { TableRow row = table.getRows().get(i); for (int j = 0; j < row.getCells().getCount(); j++) { TableCell cell = row.getCells().get(j); // 获取单元格第一个段落 Paragraph para = cell.getParagraphs().get(0); // 修改文本颜色(支持RGB值) for (Object obj : para.getChildObjects()) { if (obj instanceof TextRange) { TextRange text = (TextRange) obj; text.getCharacterFormat().setTextColor(new Color(255, 0, 0)); // 设置为红色 } } } } // 保存修改后的文档 doc.saveToFile("output.docx", FileFormat.Docx_2013); doc.dispose(); } } ``` ### 关键API说明 1. `Table.getRows()`: 获取所有行集合 2. `TableCell.getParagraphs()`: 获取单元格内的段落集合 3. `TextRange.getCharacterFormat()`: 获取字符格式对象 4. `CharacterFormat.setTextColor()`: 设置文字颜色(支持`java.awt.Color`) [^1]: Spire.Doc支持直接操作Office文档格式而无需安装Microsoft Office [^2]: 保存文档时需显式指定输出格式,如Docx_2013表示生成Office 2013格式文档
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值