java 批量生成word 文件

最近在工作中遇到一個(gè)需求,我有一個(gè)擁有3000行數(shù)據(jù)的excel文件和一個(gè)word模板。

我需要將excel文件中的每一行數(shù)據(jù)填充到word模板文件中生成一個(gè)Word文件。

考慮到數(shù)據(jù)量較大且需求有可能重復(fù),所以我干脆花時(shí)間寫了個(gè)程序來(lái)解決這個(gè)問(wèn)題。

讀取Excel文件的數(shù)據(jù)

首先我需要讀取Excel文件的數(shù)據(jù)。代碼如下:

public static List<Map> readTable() throws Exception {
        Map map = new HashMap<String, String>();
        List<Map> list = new ArrayList<Map>();
        InputStream ips = new FileInputStream("/Users/rar/Documents/123.xlsx");
        XSSFWorkbook wb = new XSSFWorkbook(ips);
        Sheet sheet1 = wb.getSheetAt(0);
        for (Row row : sheet1) {
            String name = row.getCell(0).getStringCellValue();
            String phoneNumber = row.getCell(2).getStringCellValue();
            String account = row.getCell(4).getStringCellValue();

            Map dataMap = new HashMap();
            dataMap.put("name", name);
            dataMap.put("account", idCard);
            dataMap.put("phoneNUmber", phoneNumber);
            list.add(dataMap);
        }
        return list;
    }
    

如果你需要判斷單元格中數(shù)據(jù)的類型,可在迭代中加入如下代碼:

        for (Cell cell : row) {
                switch (cell.getCellType()) {
                    case HSSFCell.CELL_TYPE_BOOLEAN:
                        //得到Boolean對(duì)象的方法
                        cell.getBooleanCellValue();
                        break;
                    case HSSFCell.CELL_TYPE_NUMERIC:
                        //先看是否是日期格式
                        if(HSSFDateUtil.isCellDateFormatted(cell)){
                            //讀取日期格式
                            cell.getDateCellValue();
                        }else{
                            //讀取數(shù)字
                            cell.getNumericCellValue();
                        }
                        break;
                    case HSSFCell.CELL_TYPE_FORMULA:
                        //讀取公式
                        cell.getCellFormula();
                        break;
                    case HSSFCell.CELL_TYPE_STRING:
                        //讀取String
                        cell.getRichStringCellValue();
                        break;
                    default:
                }

        }

寫入到Word文件中

將數(shù)據(jù)填充到Word文件中,我使用了freemarker。需要將模板文件中需要填充的字段,使用${}代替,比如我需要在文件開頭填入姓名,那么我就在文件開頭寫${name}。然后將文件導(dǎo)出成xml文件。這個(gè)xml文件就是程序需要的模板文件。

代碼如下:

        //加載模板文件
        public Template getTemplate() throws IOException {
            configuration.setDirectoryForTemplateLoading(new File("/Users/rar/Documents"));
            Template t = null;
            try {
                // data.xml為要裝載的模板
                t = configuration.getTemplate("data.xml");
                t.setEncoding("utf-8");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return t;
        }
        //wordName為word文件名
        public Writer getWriter(String wordName){
            String savePath = "/Users/rar/Documents/";
            File file = new File(savePath+"upload");
            if(!file.exists()){
                file.mkdirs();
            }
            File outFile = new File(savePath+"upload/"+wordName+".doc");
            Writer out = null;
            try {
                out = new BufferedWriter(new OutputStreamWriter(
                        new FileOutputStream(outFile), "utf-8"));
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            return out;
        }

        //創(chuàng)建 并寫入數(shù)據(jù)到word文件
        public void createDoc(Template t,Map dataMap,Writer out) {
            try {
                t.process(dataMap, out);
                out.close();
            } catch (TemplateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
public class excelToWord {
    public static  void main(String[] args) throws Exception {
        personnelImportWord();
    }



    private static void personnelImportWord() throws Exception{
        DocumentHandler dh = new DocumentHandler();
        Template t = dh.getTemplate();

        List<Map> list=ReadExcelTable.readTable();
        for (Map map : list){
            Writer out = dh.getWriter((String)map.get("name"));
            dh.createDoc(t,map, out);
        }

    }
}

pom文件如下:

<dependencies>   
 <dependency>       
    <groupId>org.freemarker</groupId>   
    <artifactId>freemarker</artifactId>    
    <version>2.3.22</version>  
  </dependency>  
  <dependency>    
     <groupId>org.apache.poi</groupId>  
     <artifactId>poi</artifactId>   
     <version>3.14</version> 
   </dependency> 
   <dependency>    
    <groupId>org.apache.poi</groupId>   
     <artifactId>poi-ooxml</artifactId>    
    <version>3.13</version>  
   </dependency>
</dependencies>

程序成功運(yùn)行:

1.png

github:https://github.com/erwincat/toWord

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,802評(píng)論 25 709
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,627評(píng)論 18 399
  • 這場(chǎng)仗從一開始就輸定了,我早就知道,但我還是沒(méi)辦法阻止自己愛(ài)上她?!?“她是誰(shuí)?” “就是那個(gè)跟肌肉男牽著手的人,...
    在草地上奔跑的壯漢閱讀 489評(píng)論 0 0
  • 誰(shuí)說(shuō)愛(ài)情一定要是喜悅溫暖。愛(ài)也可以是身心冰冷。愛(ài)甚至可以和戀愛(ài)沒(méi)有一絲聯(lián)系。它從來(lái)不是輕浮的存在。 他扎進(jìn)你的骨髓...
    哪吒的肉閱讀 259評(píng)論 0 0

友情鏈接更多精彩內(nèi)容