java 批量生成word 文件

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

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

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

讀取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對象的方法
                        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)容合作請聯(lián)系作者
  • 序言:七十年代末柴梆,一起剝皮案震驚了整個(gè)濱河市陨溅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绍在,老刑警劉巖门扇,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異偿渡,居然都是意外死亡臼寄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門卸察,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脯厨,“玉大人,你說我怎么就攤上這事坑质『衔洌” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵涡扼,是天一觀的道長稼跳。 經(jīng)常有香客問我,道長吃沪,這世上最難降的妖魔是什么汤善? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮票彪,結(jié)果婚禮上红淡,老公的妹妹穿的比我還像新娘。我一直安慰自己降铸,他們只是感情好在旱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著推掸,像睡著了一般桶蝎。 火紅的嫁衣襯著肌膚如雪驻仅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天登渣,我揣著相機(jī)與錄音噪服,去河邊找鬼。 笑死胜茧,一個(gè)胖子當(dāng)著我的面吹牛粘优,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播竹揍,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼敬飒,長吁一口氣:“原來是場噩夢啊……” “哼邪铲!你這毒婦竟也來了芬位?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤带到,失蹤者是張志新(化名)和其女友劉穎昧碉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揽惹,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡被饿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搪搏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狭握。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖疯溺,靈堂內(nèi)的尸體忽然破棺而出论颅,到底是詐尸還是另有隱情,我是刑警寧澤囱嫩,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布恃疯,位于F島的核電站,受9級特大地震影響墨闲,放射性物質(zhì)發(fā)生泄漏今妄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一鸳碧、第九天 我趴在偏房一處隱蔽的房頂上張望盾鳞。 院中可真熱鬧,春花似錦瞻离、人聲如沸腾仅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽攒砖。三九已至缸兔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吹艇,已是汗流浹背惰蜜。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留受神,地道東北人抛猖。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像鼻听,于是被迫代替她去往敵國和親财著。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理撑碴,服務(wù)發(fā)現(xiàn)撑教,斷路器,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評論 25 707
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法醉拓,類相關(guān)的語法伟姐,內(nèi)部類的語法,繼承相關(guān)的語法亿卤,異常的語法愤兵,線程的語...
    子非魚_t_閱讀 31,622評論 18 399
  • 這場仗從一開始就輸定了,我早就知道排吴,但我還是沒辦法阻止自己愛上她秆乳。” “她是誰钻哩?” “就是那個(gè)跟肌肉男牽著手的人屹堰,...
    在草地上奔跑的壯漢閱讀 429評論 0 0
  • 誰說愛情一定要是喜悅溫暖双藕。愛也可以是身心冰冷。愛甚至可以和戀愛沒有一絲聯(lián)系阳仔。它從來不是輕浮的存在忧陪。 他扎進(jìn)你的骨髓...
    哪吒的肉閱讀 197評論 0 0