这两天用POI生成Excel,看了看头儿给的例子就动手开始写,写的还算顺利,数据可以导出到Excel中了,而接下来的布局就很麻烦了,所有的
操作都需要用程序来控制,写了一会我觉得这样不行,应该弄一个模板,于是我把Excel的格式提取出来,放到一个新的Excel文件中,每次都
打开这个模板文件,从这个模板文件里边插入数据,只是在保存的时候把数据保存到另外一个Excel文件中,这样就可以省去了不少布局的麻烦
。当然这也存在些问题:
如果有多个sheet怎么办?答:如果需要多个sheet可以在模板中多创建几个模板sheet。
如果我创建的好多模板sheet但是有用不了那么多呢?答:可以在保存之前把多于的sheet删除掉。
上面两个问题都解决了,按说应该是没有问题了,但是新的问题出现了,excel可以生成,但是打开后sheet不能切换,一切换就报错。查了半
天不知是什么原因,找头儿给我看,他看了会跟我说代码没有问题,问题是Excel模板必须把最后添加的sheet设置成选中状态,不能是别的
sheet。比如你有从sheet1到sheet9这九个sheet所以你就要把sheet9设置成选中然后保存。这样根据模板到处的excle才没有问题。
public static void createExcelFromTemplate(String templateFile, String saveFile, ArrayList excelData)
{
// 读取模板Excel
HSSFWorkbook tempWorkBook = new HSSFWorkbook(new FileInputStream(templateFile));
//处理excel
//
tempWorkBook = deleteSheet(tempWorkBook);
//保存Excel
generateExcel(tempWorkBook, saveFile);
}
/*由HSSFWorkbook生成Excel文档
*
* */
public static void generateExcel(HSSFWorkbook wb, String saveFile) {
try {// 新建一输出文件流
FileOutputStream fOut = new FileOutputStream(saveFile);
// 把相应的Excel 工作簿存盘
wb.write(fOut);
fOut.flush();
// 操作结束,关闭文件
fOut.close();
} catch (Exception e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
//删除多于的Sheet
public static HSSFWorkbook deleteSheet(HSSFWorkbook wb) {
int totalSheets = wb.getNumberOfSheets() - 1;
while (0 <= totalSheets) {
if (wb.getSheetName(totalSheets).lastIndexOf("Sheet") == 0) {
wb.removeSheetAt(totalSheets);
totalSheets--;
} else {
totalSheets--;
}
}
return wb;
}
{
// 读取模板Excel
HSSFWorkbook tempWorkBook = new HSSFWorkbook(new FileInputStream(templateFile));
//处理excel
//
tempWorkBook = deleteSheet(tempWorkBook);
//保存Excel
generateExcel(tempWorkBook, saveFile);
}
/*由HSSFWorkbook生成Excel文档
*
* */
public static void generateExcel(HSSFWorkbook wb, String saveFile) {
try {// 新建一输出文件流
FileOutputStream fOut = new FileOutputStream(saveFile);
// 把相应的Excel 工作簿存盘
wb.write(fOut);
fOut.flush();
// 操作结束,关闭文件
fOut.close();
} catch (Exception e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
//删除多于的Sheet
public static HSSFWorkbook deleteSheet(HSSFWorkbook wb) {
int totalSheets = wb.getNumberOfSheets() - 1;
while (0 <= totalSheets) {
if (wb.getSheetName(totalSheets).lastIndexOf("Sheet") == 0) {
wb.removeSheetAt(totalSheets);
totalSheets--;
} else {
totalSheets--;
}
}
return wb;
}