Java POI Word 写文档

package apache.poi;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;


public class ExportDocTest {
    
    public static void main(String[] args) {
        String destFile="D:\\11.doc";
        //#####################根据自定义内容导出Word文档##########################
        StringBuffer fileCon=new StringBuffer();
        fileCon.append("               张大炮            男              317258963215223\n" +
                "2011     09        2013     07       3\n" +
                "    二炮研究              成人\n" +
                "2013000001                             2013     07     08");
        fileCon.append("\n\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
        
        new ExportDocTest().exportDoc(destFile, fileCon.toString());
        
        //##################根据Word模板导出单个Word文档##########################
        Map<String, String> map=new HashMap<String, String>();
        
        map.put("name", "Zues");
        map.put("sex", "男");
        map.put("idCard", "200010");
        map.put("year1", "2000");
        map.put("month1", "07");
        map.put("year2", "2008");
        map.put("month2", "07");
        map.put("gap", "2");
        map.put("zhuanye", "计算机科学与技术");
        map.put("type", "研究生");
        map.put("bianhao", "2011020301");
        map.put("nowy", "2011");
        map.put("nowm", "01");
        map.put("nowd", "20220301");
        //注意biyezheng_moban.doc文档位置,此例中为应用根目录
        HWPFDocument document=new ExportDocTest().replaceDoc("biyezheng_moban.doc", map);
        ByteArrayOutputStream ostream = new ByteArrayOutputStream();
        try {
            document.write(ostream);
            //输出word文件
            OutputStream outs=new FileOutputStream(destFile);
            outs.write(ostream.toByteArray());
            outs.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
    
    
    /**
     * 
     * @param destFile
     * @param fileCon
     */
    public void exportDoc(String destFile,String fileCon){
        try {
            //doc content
            ByteArrayInputStream bais = new ByteArrayInputStream(fileCon.getBytes());
            POIFSFileSystem fs = new POIFSFileSystem();
            DirectoryEntry directory = fs.getRoot(); 
            directory.createDocument("WordDocument", bais);
            FileOutputStream ostream = new FileOutputStream(destFile);
            fs.writeFilesystem(ostream);
            bais.close();
            ostream.close();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    
    /**
     * 读取word模板并替换变量
     * @param srcPath
     * @param map
     * @return
     */
    public HWPFDocument replaceDoc(String srcPath, Map<String, String> map) {
        try {
            // 读取word模板
            FileInputStream fis = new FileInputStream(new File(srcPath));
            HWPFDocument doc = new HWPFDocument(fis);
            // 读取word文本内容
            Range bodyRange = doc.getRange();
            // 替换文本内容
            for (Map.Entry<String, String> entry : map.entrySet()) {
                bodyRange.replaceText("${" + entry.getKey() + "}", entry
                        .getValue());
            }
            return doc;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Flutter入门

Kotlin中的函数

函数还可以用中缀表示法调用,当他们是成员函数或扩展函数,只有一个参数,用 infix关键字标注

1164
来自专栏lulianqi

支持各种特殊字符的 CSV 解析类 (.net 实现)(C#读写CSV文件)

csv(Comma Separated Values)逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本...

902
来自专栏智能算法

极简Python入门

本文旨在帮助从总体上帮助了解Python的一些基本属性,具体的使用技巧需要通过不断实践积累 一、Python的基本特性 ? ? ? 二、Python的类 ...

2706
来自专栏nothing

在 C++ 中,你甚至可以 b()()()(); ——介绍 ref qualifier

在传统 C++ 中,成员函数通过 this 指针访问。可以处理所有需要左值的情况。

1162
来自专栏全沾开发(huā)

JavaScript中的比较运算符

JavaScript中的比较运算符 JavaScript中的比较运算符粗略的可以分为两种: 相等运算符(==、===、!==)这些 ...

3347
来自专栏五毛程序员

C++知识点整理——持续更新

1884
来自专栏林德熙的博客

win10 uwp 如何判断一个对象被移除

有时候需要知道某个元素是否已经被移除,在优化内存的时候,有时候无法判断一个元素是否在某个地方被引用,就需要判断对象设置空时是否被回收。 本文告诉大家一个简单的方...

431
来自专栏超然的博客

js数据类型

string、number、Boolean、Array、object、Null、Undefined

851
来自专栏iOS开发攻城狮的集散地

浅谈iOS内存管理机制

1989
来自专栏Nian糕的私人厨房

JavaScript 常见面试题分析(一)

这道题考察的是 JS 的变量类型,JS 的变量类型有值类型和变量类型两种,值类型包括 undefined、字符串、数字、布尔值,引用类型包括对象、数组、函数

714

扫码关注云+社区