在实际项目中往往有这种需求,把JSP页面上展示的报表导出成Excel,本站曾展示过程序实例。但这种方法过于繁琐,程序冗长,缺乏通用性。其实我们完全可以用另一种思路来实现Excel的导出。
我们发现,在Java导出Excel的函数中花了很大篇幅绘制Excel表头,例如背景色、合并单元格、字体等等。为了减少这部分的代码量,我们可以直接把表头在Excel中绘制好,然后存在服务器的某个路径中,这个绘制好表头的Excel称作一个模板。在下载函数中,我们首先读取这个模板,然后另存一份到下载路径中,再往这个另存的Excel文件中写数据。如果这个Excel模板表头占了1行,我们就从第2行开始写数据,如果表头占了2行,就从第3行开始写数据,依此类推。
表头的设计方法如下:
其中第3行的英文字段与Map中的key相对应,一般用户不需要看到这一行,我们可以将之隐藏:
我们可以从程序中获取到,该表头实际占了3行,那么我们就从第4行开始写数据。
完整代码如下:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.io.File;
import jxl.Cell;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;public class ExportExcel {
/**
* 测试函数
* @param args
*/
public static void main(String[] args) {
Map map1 = new HashMap();
map1.put("name", "张三");
map1.put("age", "20");
Map map2 = new HashMap();
map2.put("name", "李四");
map2.put("age", "21");
List<Map> list = new ArrayList(5);
list.add(map1);
list.add(map2);
ExportExcel export= new ExportExcel();
export.exportExcel("E:\\test.xls","D:\\test.xls",list);
}
/**
* Excel文件下载
* @param templetPath 模板路径(只包含表头)
* @param targetPath 文件生成路径
* @param valueList 数据列表
*/
public void exportExcel(String templetPath,String targetPath,List<Map> valueList){
try {
Workbook wb=Workbook.getWorkbook(new File(templetPath));
WritableWorkbook book= Workbook.createWorkbook(new File(targetPath),wb);
WritableSheet sheet = book.getSheet(0); //获取Excel文件的第一个工作表
WritableFont wf = new WritableFont(WritableFont.ARIAL,12,WritableFont.NO_BOLD,false,
UnderlineStyle.NO_UNDERLINE,Colour.BLACK); //定义格式 字体 下划线 斜体 粗体 颜色
WritableCellFormat wcf = new WritableCellFormat(wf); //单元格定义
wcf.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN,jxl.format.Colour.BLACK); //设置边框
wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
wcf.setAlignment(Alignment.RIGHT);
int columnum = sheet.getColumns();
int rownum = sheet.getRows();
System.out.println("表头列数:"+columnum+" 表头行数:"+rownum);
for (int i=0;i<valueList.size();i++){ //按行循环
Map item = valueList.get(i);
for(int j=0;j<columnum;j++){ //按列循环
Cell cell = sheet.getCell(j,rownum-1); //获取Excel模板中的隐藏列
String result = cell.getContents();
sheet.addCell(new Label(j, i+rownum, item.get(result)==null?"":item.get(result).toString(), wcf));
}
}
book.write();
book.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
该代码中的exportExcel方法为通用方法。实际调用这个方法的代码只有一句:
export.exportExcel("E:\\test.xls","D:\\test.xls",list);
这个List我这里是手动生成的,也可以是从数据库里直接查出来,然后将之作为参数去调用exportExcel方法。通过这种方式,已经大大地减少了我们的工作量。
转载请注明:观测者 » Java导出Excel的另一种思路