SXSSFWorkbook使用补充
今天使用SXSSFWorkbook导出了一份比较复杂的Excel文件,总结如下
竖向文字
CellStyle cellStyle = sheet.getWorkbook().createCellStyle(); cellStyle.setRotation((short)255);//将文本改为竖向 cellStyle.setVerticalAlignment(VerticalAlignment.TOP);//设置单元格顶端对其
合并单元格
//第一个参数startRow,开始行 //第二个参数endRow,结束行 //第三个参数startCol,开始列 //第四个参数endCol,结束列 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2));//合并第一行0、1、2单元格
CellStyle克隆合并
有些情况下一个单元格需要两个CellStyle,但是设置第二个CellStyle时第一个CellStyle会被覆盖,官网提供了一个方法用来合并CellStyle
//第一个CellStyle,仅设置竖向显示文字 CellStyle cellStyle1 = sheet.getWorkbook().createCellStyle(); cellStyle1.setRotation((short) 255); //第二个CellStyle,仅设置单元格背景颜色 CellStyle cellStyle2 = sheet.getWorkbook().createCellStyle(); cellStyle2.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex()); cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); //合并cellStyle1和cellStyle2,cellStyle1既可以竖向显示文字又可以设置单元格背景颜色 cellStyle1.cloneStyleFrom(cellStyle2);
改变文本颜色
CellStyle cellStyle = sheet.getWorkbook().createCellStyle(); Font font = sheet.getWorkbook().createFont(); font.setColor(IndexedColors.RED.getIndex()); cellStyle.setFont(font);
分块制表
按照通常的逻辑,制表的顺序应该是先从第一行开始,第一行完成后,开始处理第二行,以此类推。
但是有时会遇到一种情况,分块制表比较方便,即处理完(A1,D4)
后再处理(E1,H4)
,但是这样就会有一个问题,我在处理(A1,D4)
时使用sheet.createRow()
创建了四个Row
对象,(A1,D4)
处理完成后再处理(E1,H4)
时,我又使用sheet.createRow()
创建了四个Row
对象,这时我发现,(A1,D4)
中的数据被清空了,于是我想,会不会是(A1,D4)
中的行对象被覆盖了,看了源码后发现确实是这样
private final TreeMap<Integer, SXSSFRow> _rows = new TreeMap(); public SXSSFRow createRow(int rownum) { /*此处省略部分代码*/ SXSSFRow newRow = new SXSSFRow(this); this._rows.put(rownum, newRow); /*此处省略部分代码*/ }
这样的话我们只能在处理表格之前先使用sheet.createRow(index)
把Row
对象一次性创建出来,只后需要用到Row
对象时,直接使用sheet.getRow(index)
即可,我自己写了一个方法,可以参考一下。
/** * 在sheet页中创建行与单元格 * @param sheet * @param startRow 开始行 * @param endRow 结束行 */ private void createRow(Sheet sheet, int startRow, int endRow) { for (int i = startRow; i < endRow; i++) { Row row = sheet.createRow(i); } }
参考网站:http://poi.apache.org/apidocs/dev/org/apache/poi/xssf/usermodel/XSSFWorkbook.html