您的位置:首页 > 其它

使用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)

改正:

// 复制样式。如果直接使用其他 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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: