今天使用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 = 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
原文:https://www.cnblogs.com/MrZhaoyx/p/13102883.html