JXL使用总结
JXL使用总结
因为已经有关于JXL读取Excel的总结了,这里就不再赘述了,下边总结一下导出Excel的操作。
JXL导出Excel
POI在创建工作表、行、列的时候和读取Excel是一样的:
//创建Sheet工作表 Sheet sheet = wb.createSheet("格式测试POI"); //创建一行 row = sheet.createRow(0); //设置行高 row.setHeight((short) 420); //创建一个单元格 cell = row.createCell(0); //将单元格内容设为"格式测试" cell.setCellValue("格式测试"); //设置单元格样式 cell.setCellStyle(titleStyle); |
POI导出Excel可以选择两种方式:
- 通过模板的导出:
通过模板导出主要就是在项目中,或本地磁盘中有此模板,单元格的样式和其中的单元格和并出来的区域,斜线表头等等,都先设置好,然后在程序需要输出的时候拿到模板文件,直接在其中写入要写的数据,将样式填充好,这个方法还是很简单的,下边主要着重讲解如何控制代码进行导出。
- 通过自己控制代码,控制样式的导出:
POI所有样式的超类为CellStyle,所以所有的样式都包含在了CellStyle中,在操作导出样式的时候直接在CellStyle中进行操作就可以了。
//创建单元格样式 CellStyle cellStyle = wb.createCellStyle(); //创建字体 Font cellFont = wb.createFont(); //设置字体倾斜 cellFont.setItalic(true); //设置字体加粗 cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //设置字体高度 cellFont.setFontHeight((short) 220); //设置字体 cellFont.setFontName("黑体"); //设置删除线 cellFont.setStrikeout(true); //设置下划线 cellFont.setUnderline(Font.U_DOUBLE); //设置文字水平居中 cellStyle.setAlignment(CellStyle.ALIGN_CENTER); //设置下边框 cellStyle.setBorderBottom((short) BorderStyle.DASH_DOT.ordinal()); //设置左边框 cellStyle.setBorderLeft(CellStyle.BORDER_DASHED); //设置右边框 cellStyle.setBorderRight((short) BorderStyle.DOUBLE.ordinal()); //设置上边框 cellStyle.setBorderTop(CellStyle.BORDER_MEDIUM); //设置填充样式,如果设置前景色填充,则必须要有此项 cellStyle.setFillPattern((short) FillPatternType.BIG_SPOTS.ordinal()); //设置前景色 cellStyle.setFillForegroundColor(HSSFColor.RED.index); //设置字体 cellStyle.setFont(cellFont); //设置自动换行,默认为不换行 cellStyle.setWrapText(true); //设置右边框颜色 cellStyle.setRightBorderColor(HSSFColor.RED.index); //设置文本旋转度 cellStyle.setRotation((short) 30); //设置缩进 cellStyle.setIndention((short) 20); //设置垂直对齐方式 cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); |
根据以上的代码就可以做出一个样式出来。
合并单元格,合并单元格也有两种方式:
//合并A1:G1区域的单元格 CellRangeAddress cellrangeaddress = CellRangeAddress.valueOf("A1:G1"); //合并A1:G1区域的单元格 CellRangeAddress cellrangeaddress = new CellRangeAddress(0, 0, 0, 6); |
以上两种方式都是对A1:G1区域的单元格进行合并,第一种方式更加形象和具体,也更接近于操作Excel的习惯;第二种方式需要自己去琢磨单元格区域的位置,所以我更倾向于第一种的操作。
在合并的单元格中添加数据的方法,只需要在合并单元格的第一个单元格的位置加入数据即可,如果需要设定样式,也只需要对第一个进行操作,但是如果对于给合并单元格设置边框则需要用到另一种方式,需要用到POI当中的另一个工具类RegionUtil。
/** * 为合并以后的单元格加上边框 * @param cellrangeaddress 合并单元格区域 * @param sheet 工作表 * @param workbook 工作簿空间 */ public void addRegionBorder(CellRangeAddress cellrangeaddress, Sheet sheet, Workbook workbook) { RegionUtil.setBorderBottom(HSSFCellStyle.BORDER_THIN, cellrangeaddress, sheet, workbook); RegionUtil.setBorderLeft(HSSFCellStyle.BORDER_THIN, cellrangeaddress, sheet, workbook); RegionUtil.setBorderRight(HSSFCellStyle.BORDER_THIN, cellrangeaddress, sheet, workbook); RegionUtil.setBorderTop(HSSFCellStyle.BORDER_THIN, cellrangeaddress, sheet, workbook); } |
合并单元格之所以要这样做,主要是因为如果只用一个单元格的样式来设置此合并区域单元格的样式的话就会出现缺少边框的现象。
POI还可以对Excel表格进行冻结和对所选单元格进行自动筛选的功能,实现代码如下:
//冻结单元格,冻结区域为1、2行 sheet.createFreezePane(0, 2); //设置自动筛选为A2:E2的区域 cellrangeaddress = CellRangeAddress.valueOf("C2:G2"); //将所设置的区域设置为自动筛选 sheet.setAutoFilter(cellrangeaddress); |
这样一个Excel的格式基本就设置完成了,现在可以将文件进行输出了:
//打开输出流到D:/POI.xls文件 FileOutputStream fos = new FileOutputStream("D:/POI.xls"); //将文件写入到输出流中 wb.write(fos); if (fos != null) { //关闭输出流 fos.close(); } |
如果需要改为下载方式,就可以用获得的输出流,然后将文件输出到响应的输出流中了。
POI操作Excel文件的方法还有很多,也还有许多我不知道的方法,如果大家有时间可以一起研究。
POI网站:http://poi.apache.org/
POI API:http://poi.apache.org/apidocs/index.html