Blue(l'mAlex的迷弟) 2024-07-15 20:53 采纳率: 92.3%
浏览 23
已结题

Apache poi使用问题

这是我使用Apache poi遇到的问题
我创建了一个模板text2.docx:

img

然后使用一下代码:

 @Test
    public void test2() throws IOException {
   //模板路径
   String path = "D:\\ml\\idea\\jishedemo1\\src\\main\\resources\\doc\\text2.docx";
   //读取模板内容
   XWPFTemplate template = XWPFTemplate.compile(path);
   Map<String,Object> map= new HashMap<>();
   map.put("date","你好1234");//键名称要和模板里面的名称一致
   template.render(map);
   template.writeAndClose(new FileOutputStream("D:\\ml\\idea\\jishedemo1\\src\\main\\resources\\doc\\test1.docx"));
    }

img

我发现,生成的test1文档并不会出现中文,只会出现数字?查询了很多资料也不知道为什么,可以请帮忙嘛?

  • 写回答

12条回答 默认 最新

  • svygh123 2024-07-15 21:31
    关注

    下面是一个简单的例子,展示了如何根据一个包含占位符${name}.docx模板文件,将其渲染为具体的值李丽丽,并确保中文字符能够正确显示:

    import org.apache.poi.xwpf.usermodel.XWPFTemplate;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import com.deepoove.poi.XWPFTemplate;
    import com.deepoove.poi.data.TextRenderData;
    import com.deepoove.poi.util.BytePictureUtils;
    
    import java.io.*;
    import java.nio.charset.StandardCharsets;
    import java.util.HashMap;
    import java.util.Map;
    
    public class RenderDocxTemplate {
    
        public static void main(String[] args) throws IOException {
            // 模板文件路径
            String templatePath = "D:\\templates\\template.docx";
            // 输出文件路径
            String outputPath = "D:\\output\\output.docx";
    
            // 加载模板
            XWPFTemplate template = XWPFTemplate.compile(templatePath).render();
    
            // 数据准备
            Map<String, Object> params = new HashMap<>();
            params.put("name", new TextRenderData("宋体", 16, "李丽丽")); // 使用TextRenderData可以指定字体,确保中文显示
    
            // 渲染模板
            template.render(params);
    
            // 写入输出文件,这里通过ByteArrayOutputStream和FileOutputStream结合,避免直接操作FileOutputStream可能引起的编码问题
            try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
                 OutputStream fos = new FileOutputStream(outputPath)) {
                template.write(baos);
                fos.write(baos.toByteArray());
            }
    
            // 关闭模板
            template.close();
        }
    }
    

    这段代码使用了com.deepoove.poi包下的类,这是Apache POI的一个扩展库Deepoove POI-Tl,它提供了更便捷的方式来处理模板和数据渲染。请注意,你需要在项目中引入相应的依赖来使用Deepoove POI-TL。

    要在Maven项目中引入Deepoove POI-TL依赖,你可以在项目的pom.xml文件中添加如下依赖配置:

    <dependencies>
        <!-- Deepoove POI-TL -->
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <!-- 请检查并使用最新版本号 -->
            <version>1.18</version>
        </dependency>
    
        <!-- Apache POI 是 Deepoove POI-TL 的基础依赖,通常情况下会自动引入,但也可以显式声明 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <!-- 使用对应版本,确保与poi-tl兼容 -->
            <version>5.2.2</version>
        </dependency>
    </dependencies>
    

    如果是使用Gradle作为构建工具,可以在build.gradle文件中添加如下依赖:

    dependencies {
        implementation 'com.deepoove:poi-tl:1.18' // 替换为最新版本
        implementation 'org.apache.poi:poi-ooxml:5.2.2' // 确保与poi-tl版本兼容
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(11条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月15日
  • 已采纳回答 7月15日
  • 创建了问题 7月15日

悬赏问题

  • ¥15 加装宝马安卓中控改变开机画面
  • ¥15 STK安装问题问问大家,这种情况应该怎么办
  • ¥15 更换了一个新的win10系统,再下载VS时碰到的问题,是C++组件的?
  • ¥15 关于罗技鼠标宏lua文件的问题
  • ¥15 halcon ocr mlp 识别问题
  • ¥15 已知曲线满足正余弦函数,根据其峰值,还原出整条曲线
  • ¥20 无法创建新的堆栈防护界面
  • ¥15 sessionStorage在vue中的用法
  • ¥15 wordpress更换域名后用户图片头像不显示
  • ¥15 如何在ubunto上安装CEF (Chromium Embedded Framework),并且基于qt实现打开一个web