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)

改正:

 // 复制样式。如果直接使用其他 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;
}
}

使用POI操作Excel使用小总结的更多相关文章

  1. POI操作Excel

    POI和Excel简介 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作 ...

  2. 自己封装的poi操作Excel工具类

    自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...

  3. 自己的包poi操作Excel工具

    在前面的文章<使用poi读写Excel>中分享了一下poi操作Excel的简单演示样例.这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完毕的功能是:读取Excel.汇总E ...

  4. Java POI操作Excel注意点

    excel的行索引和列索引都是从0开始,而行号和列号都是从1开始 POI·操作excel基本上都是使用索引 XSSFRow对象的 row.getLastCellNum() 方法返回的是当前行最后有效列 ...

  5. POI操作Excel(xls、xlsx)

    阿帕奇官网:http://poi.apache.org/ POI3.17下载:http://poi.apache.org/download.html#POI-3.17 POI操作Excel教程(易百教 ...

  6. 使用POI操作Excel时对事先写入模板的公式强制执行

    场景:POI读取Excel模板. 当使用POI操作Excel时,发现由POI生成的公式能够在打开Excel是被执行, 而事先手工写入Excel模板文件的公式则不自动被调用,必须手动双击该Cell才能生 ...

  7. POI操作Excel异常Cannot get a text value from a numeric cell

    控制台抛出异常:java.lang.IllegalStateException: Cannot get a text value from a numeric cell 在java中用POI解析exc ...

  8. java使用POI操作excel文件,实现批量导出,和导入

    一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...

  9. 利用Apache POI操作Excel

    最近在做接口,有个功能是利用Excel导入汽车发动机所需零件信息到线上系统中.简单回顾一下之前学过的用java操作Excel. 1.maven配置Apache POI pom.xml中配置POIjar ...

随机推荐

  1. [FOJ 1752] A^B mod C

    Problem 1752 A^B mod C Accept: 750    Submit: 3205Time Limit: 1000 mSec    Memory Limit : 32768 KB   ...

  2. 如果在Xcode6中创建空工程, 删除冗余信息

    http://stackoverflow.com/questions/25783282/how-to-create-an-empty-application-in-xcode-6-without-st ...

  3. HDU5653 Bomber Man wants to bomb an Array 简单DP

    题意:bc 77 div1 1003(中文题面) 分析:先不考虑将结果乘以 1e6. 设 dp[i] 为从前 i 个格子的状态可以获得的最大破坏指数. 那么我们可以枚举每个炸弹,该炸弹向左延伸的距离和 ...

  4. 跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量

    跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量 This example program demonstrates the basic usage of a measure object. ...

  5. HUFFMAN 树

    在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN) 树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如 JPEG中就应用了哈夫曼编码. 首先介绍什么 ...

  6. bzoj 2242 [SDOI2011]计算器(数论知识)

    Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...

  7. shell脚本应用(3)--语法结构

    判断语句 条件判断 test expression [ expression ] 条件表达式中常用的判断 数值-eq -ne -gt -lt -ge -le[equal not greater tha ...

  8. 关于int **

    例子1: int foo(int *array) { array = (); ; } //外头调用 int * uidArray = NULL; foo(uidArray): 这时候我想要在函数里给数 ...

  9. Laravel教程:laravel 4安装及入门

    一.安装Composer首先你需要安装Composer,Composer是PHP依赖管理工具,Laravel框架就是使用 Composer 执行安装和依赖管理. 注:(1)若安装Composer出错, ...

  10. python 探索(四) Python CookBook 系统管理

    看CookBook就像看小说,挑感兴趣的先学习. 所以继<文本>之后,开始<系统管理>. 同样,请善用目录. 发现一个cookbook:好地址 生成随机密码 from rand ...