使用POI操作Excel使用小总结
2016-04-06 22:06
399 查看
1. Workbook维护一个调色板,可以自定义设置56种颜色,下标从8到63. 用到颜色的地方,可以输入下标获取颜色,如CellStyle的setFillForegroundColor();
2.CreateCellStyle 创建之后,会把CellStyle放入到workbook维护的队列中,最多只能创建4000个样式。
因此,CellStyle应尽可能复用,以防创建了4000个之后发生异常。
如果没有显式地给一个Cell设置CellStyle,那么其获取的将是默认的CellStyle,将会影响到全局的样式,慎用。
可以使用一个帮助类,创建常用的CellStyle。
但是有两个要注意的地方:
1)不能使用另一个workbook的CellStyle,应该在本workbook创建一个CellStyle,使用cloneStyleFrom()方法复制样式
2)复制的时候,使用了调色板下标的地方,注意调色板并没有复制过来,因此,应该把本workbook的调色板设置成源workbook的调色板一致。
错误示范:
1)workbook A使用了workbook B的样式,抛出异常
Exception in thread "main" java.lang.IllegalArgumentException: This Style does not belong to the supplied Workbook. Are you trying to assign a style from one workbook to the cell of a differnt workbook?
at org.apache.poi.hssf.usermodel.HSSFCellStyle.verifyBelongsToWorkbook(HSSFCellStyle.java:801)
at org.apache.poi.hssf.usermodel.HSSFCell.setCellStyle(HSSFCell.java:898)
at org.apache.poi.hssf.usermodel.HSSFCell.setCellStyle(HSSFCell.java:894)
at poi.test.App.main(App.java:30)
改正:
2)workbook A clone了workbook B的样式后,调色板未设置成跟workbook B一致,CellStyle的颜色仍是以workbook A的调色板取色。
3. 与CellStyle一样,不同Workbook的Font复制过来也是无效的,不会抛出异常。
Font在创建后也是会加入队列的,有32767个的限制,虽然很多,但也尽可能复用吧
错误示范:
cellStyle.setFont(CellStyleHelper.getDefaultFont());
改正:
示例代码:
2.CreateCellStyle 创建之后,会把CellStyle放入到workbook维护的队列中,最多只能创建4000个样式。
因此,CellStyle应尽可能复用,以防创建了4000个之后发生异常。
如果没有显式地给一个Cell设置CellStyle,那么其获取的将是默认的CellStyle,将会影响到全局的样式,慎用。
可以使用一个帮助类,创建常用的CellStyle。
但是有两个要注意的地方:
1)不能使用另一个workbook的CellStyle,应该在本workbook创建一个CellStyle,使用cloneStyleFrom()方法复制样式
2)复制的时候,使用了调色板下标的地方,注意调色板并没有复制过来,因此,应该把本workbook的调色板设置成源workbook的调色板一致。
错误示范:
1)workbook A使用了workbook B的样式,抛出异常
Exception in thread "main" java.lang.IllegalArgumentException: This Style does not belong to the supplied Workbook. Are you trying to assign a style from one workbook to the cell of a differnt workbook?
at org.apache.poi.hssf.usermodel.HSSFCellStyle.verifyBelongsToWorkbook(HSSFCellStyle.java:801)
at org.apache.poi.hssf.usermodel.HSSFCell.setCellStyle(HSSFCell.java:898)
at org.apache.poi.hssf.usermodel.HSSFCell.setCellStyle(HSSFCell.java:894)
at poi.test.App.main(App.java:30)
改正:
// 复制样式。如果直接使用其他 workbook的样式,会抛出异常 CellStyle cellStyle = workbook.createCellStyle(); cellStyle.cloneStyleFrom(CellStyleHelper.getDefaultCellStyle()); cell.setCellStyle(cellStyle);
2)workbook A clone了workbook B的样式后,调色板未设置成跟workbook B一致,CellStyle的颜色仍是以workbook A的调色板取色。
3. 与CellStyle一样,不同Workbook的Font复制过来也是无效的,不会抛出异常。
Font在创建后也是会加入队列的,有32767个的限制,虽然很多,但也尽可能复用吧
错误示范:
cellStyle.setFont(CellStyleHelper.getDefaultFont());
改正:
Font font = workbook.createFont(); font.setItalic(CellStyleHelper.getDefaultFont().getItalic()); cellStyle.setFont(font);
示例代码:
package poi.test; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; public class App { public static void main(String[] args) throws IOException { HSSFWorkbook workbook = new HSSFWorkbook(); Sheet sheet = workbook.createSheet("Index"); Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("fuck the world"); // 使workbook与要复制的workbook的调色板一致。 CellStyleHelper.initWorkbookPalette(workbook); // 复制样式。如果直接使用其他 workbook的样式,会抛出异常 CellStyle cellStyle = workbook.createCellStyle(); cellStyle.cloneStyleFrom(CellStyleHelper.getDefaultCellStyle()); // 复制字体样式。如果直接使用其他workbook的字体,不会抛出异常,但不会起效果,需要复制其字体样式。 Font font = workbook.createFont(); font.setItalic(CellStyleHelper.getDefaultFont().getItalic()); cellStyle.setFont(font); cell.setCellStyle(cellStyle); writeFile(workbook); System.out.println("success."); } private static void writeFile(Workbook workbook) throws IOException { OutputStream outputStream = new FileOutputStream(new File("D:\\a.xls")); workbook.write(outputStream); } }
package poi.test; import org.apache.poi.hssf.usermodel.HSSFPalette; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; public class CellStyleHelper { static CellStyle defaultCellStyle; static HSSFWorkbook workbook = new HSSFWorkbook(); static Font defaultFont; public static void initWorkbookPalette(HSSFWorkbook workbook) { // 调色板 HSSFPalette palette = workbook.getCustomPalette(); // 自定义颜色,可放置位置从8到63 palette.setColorAtIndex((short) 10, (byte) 12, (byte) 222, (byte) 123); } static { initWorkbookPalette(workbook); } public static CellStyle getDefaultCellStyle() { if (null == defaultCellStyle) { defaultCellStyle = workbook.createCellStyle(); defaultCellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); //设置前景色,使用的颜色是从调色板选取的 defaultCellStyle.setFillForegroundColor((short) 10); } return defaultCellStyle; } public static Font getDefaultFont() { if(null == defaultFont) { defaultFont = workbook.createFont(); defaultFont.setItalic(true); } return defaultFont; } }
相关文章推荐
- 整数转二进制
- 个人学习
- Makefile.am和makefile.in生成Makefile
- 程序员创业五年学到的 5 条经验
- 打印十字图
- Android Studio很卡,操作很不顺的点进来!
- Topic 与 Partition
- leetcode 2 sum& 3 sum
- 通用jdk环境配置(win7、win8.1、win8)
- [C#基础]网络编程(三):protobuf-net
- iOS wkwebkit 播放HTML5 视频 全屏问题解决
- SQLite的VACUUM命令
- fedora23 mysql的安装
- HD 1525 Euclid's Game
- Windows Server 2012 R2 部署 Exchange 2013----01
- java中重载与重写的区别
- [UITableView]beginUpdates和endUpdates - 实现UITableView的动画块
- 03_键盘读取字符串,重载函数进行操作
- 结对编程项目——四则运算
- 0406-复利计算5.0