最近在工作中遇到一個(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)行: