导出excel也类似下载,就是服务器端生成数据,通过response传递到客户端,弹出保存对话框需要在servlet中设置输出类型,对于excel设置如下:
response.setHeader("Content-disposition", "attachment; filename=test.xls");//设定输出文件头
response.setContentType("application/vnd.ms-excel");//定义输出类型
读写excel用的是POI,是apache的一个开源项目,需要去下载相关jar包,我首次接触,用起来感觉入门也算简单。
下面一段代码是页面点击后,servlet中将数据以某种形式写入excel,然后传到客户端供用户导出保存,都是很简化的,没关联数据库:
HSSFWorkbook wb = new HSSFWorkbook(); // 创建EXCEL工作簿
HSSFSheet sheet = wb.createSheet("sheet1"); // 在EXCEL工作簿中创建名为sheet的工作表
HSSFRow row = null; // 工作表中的行,从0开始
HSSFCell cell = null; // 工作表中的列,从0开始
HSSFCellStyle style = wb.createCellStyle(); // 样式
HSSFFont font = wb.createFont();
font.setColor(HSSFColor.YELLOW.index);
// 设置单元格style
style.setFillForegroundColor(HSSFColor.RED.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setFont(font);
// 对齐方式
HSSFCellStyle style_align = wb.createCellStyle();
style_align.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 横向对齐
style_align.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 纵向对齐
// 表中写入i行,j列
for(int i = 0; i < 10; i++) {
row = sheet.createRow(i);
row.setHeightInPoints((float)25.5);
//System.out.println(row.getHeightInPoints());
for(int j = 0; j < 5; j++) {
if(i == 0) {
// 合并单元格
row.createCell(0).setCellStyle(style_align); // 设置为居中对齐
row.createCell(3).setCellStyle(style_align);
row.createCell(4);
sheet.addMergedRegion(new CellRangeAddress(0,i,0,2)); // 合并0行-i行之间0列-2列
sheet.addMergedRegion(new CellRangeAddress(0,i,3,4)); // 显示的是cell(3)的值
sheet.getRow(i).getCell(0).setCellValue(new HSSFRichTextString("TITLE1"));
sheet.getRow(i).getCell(3).setCellValue(new HSSFRichTextString("TITLE2"));
sheet.getRow(i).getCell(4).setCellValue(new HSSFRichTextString("COL 5"));
break;
}
// 设置单元格
cell = row.createCell(j);
cell.setCellType(HSSFCell.CELL_TYPE_STRING); //设置单元格类型为string
cell.setCellValue(new HSSFRichTextString("row" + i + "col" + j)); //设置单元格内容
cell.setCellStyle(style);
}
}
// System.out.println(sheet.getRow(0).getCell(1).getStringCellValue()); // 报Null Pointer错误
OutputStream os = response.getOutputStream();
wb.write(os);
os.flush();
os.close();
就是先创建Excel工作簿对象,再有该工作薄对象创建工作表,再由工作表创建excel行,由行创建单元格,并能设置单元格的一些属性,上述都是最基本的,复杂的应用还是得看文档。。。
上面就是简单的在excel中写入10行5列,首行1-2列合并,3-5列合并,并横向竖向都居中对齐,其它行红色前景色,字为黄色。
由已有的excel文件创建HSSFWorkBook对象很简单:
FileInputStream fis = new FileInputStream("F://test.xls");
HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(fis)); // 由文件创建工作簿
建立输入流,然后将excel内容映射到程序中的HSSFWorkbook对象,用起来还算是蛮简单的。
读excel单元格信息就是由WorkBook获得工作表,再读取表中的行,行中的单元格,取得其中的内容,感觉挺方便的,但是涉及的东西也不少,毕竟excel本身功能也很强大,下面是简单的例子,未写完全:
FileInputStream fis = new FileInputStream("F://test.xls");
HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(fis)); // 由文件创建工作簿
HSSFRow row = null;
HSSFCell cell = null;
out.println("表名称:" + wb.getSheetName(0) + "<BR>");
HSSFSheet sheet = wb.getSheetAt(0); // 读取sheet,从0开始,获得第一个sheet,也可以通过名称
// 遍历行
for(int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) {
row = sheet.getRow(i); // 获得行
if(row != null) {
// 遍历列
for(int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {
cell = row.getCell(j);
if(cell != null) {
String value = null;
switch(cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC: // 数值型
if(HSSFDateUtil.isCellDateFormatted(cell)) {
// date 类型
value = HSSFDateUtil.getJavaDate(cell.getNumericCellValue()).toString();
} else {
// 数字
value = String.valueOf(cell.getNumericCellValue());
}
//out.println();
break;
// ...... 更多case
}
}
}
}
}
目前工作中也用不着,随便写点, 感觉这些都是看看手册就用,就能满足大部分需求的。。。似乎花时间在这些东西上面也不值得,。。。。