使用POI操作Excel使用小总结

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)

改正:

1 // 复制样式。如果直接使用其他 workbook的样式,会抛出异常
2 CellStyle cellStyle = workbook.createCellStyle();
3 cellStyle.cloneStyleFrom(CellStyleHelper.getDefaultCellStyle());
4 cell.setCellStyle(cellStyle);

2)workbook A clone了workbook B的样式后,调色板未设置成跟workbook B一致,CellStyle的颜色仍是以workbook A的调色板取色。

3. 与CellStyle一样,不同Workbook的Font复制过来也是无效的,不会抛出异常。

Font在创建后也是会加入队列的,有32767个的限制,虽然很多,但也尽可能复用吧

错误示范:

1 cellStyle.setFont(CellStyleHelper.getDefaultFont());

改正:

1 Font font = workbook.createFont();
2         font.setItalic(CellStyleHelper.getDefaultFont().getItalic());
3         cellStyle.setFont(font);

示例代码:

 1 package poi.test;
 2
 3 import java.io.File;
 4 import java.io.FileNotFoundException;
 5 import java.io.FileOutputStream;
 6 import java.io.IOException;
 7 import java.io.OutputStream;
 8
 9 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
10 import org.apache.poi.ss.usermodel.Cell;
11 import org.apache.poi.ss.usermodel.CellStyle;
12 import org.apache.poi.ss.usermodel.Font;
13 import org.apache.poi.ss.usermodel.Row;
14 import org.apache.poi.ss.usermodel.Sheet;
15 import org.apache.poi.ss.usermodel.Workbook;
16
17 public class App {
18
19     public static void main(String[] args) throws IOException {
20         HSSFWorkbook workbook = new HSSFWorkbook();
21         Sheet sheet = workbook.createSheet("Index");
22         Row row = sheet.createRow(0);
23         Cell cell = row.createCell(0);
24         cell.setCellValue("fuck the world");
25
26         // 使workbook与要复制的workbook的调色板一致。
27         CellStyleHelper.initWorkbookPalette(workbook);
28
29         // 复制样式。如果直接使用其他 workbook的样式,会抛出异常
30         CellStyle cellStyle = workbook.createCellStyle();
31         cellStyle.cloneStyleFrom(CellStyleHelper.getDefaultCellStyle());
32
33         // 复制字体样式。如果直接使用其他workbook的字体,不会抛出异常,但不会起效果,需要复制其字体样式。
34         Font font = workbook.createFont();
35         font.setItalic(CellStyleHelper.getDefaultFont().getItalic());
36         cellStyle.setFont(font);
37
38         cell.setCellStyle(cellStyle);
39
40         writeFile(workbook);
41
42         System.out.println("success.");
43     }
44
45     private static void writeFile(Workbook workbook) throws IOException {
46         OutputStream outputStream = new FileOutputStream(new File("D:\\a.xls"));
47         workbook.write(outputStream);
48     }
49 }
 1 package poi.test;
 2
 3 import org.apache.poi.hssf.usermodel.HSSFPalette;
 4 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 5 import org.apache.poi.ss.usermodel.CellStyle;
 6 import org.apache.poi.ss.usermodel.Font;
 7
 8 public class CellStyleHelper {
 9
10     static CellStyle defaultCellStyle;
11
12     static HSSFWorkbook workbook = new HSSFWorkbook();
13
14     static Font defaultFont;
15
16     public static void initWorkbookPalette(HSSFWorkbook workbook) {
17         // 调色板
18         HSSFPalette palette = workbook.getCustomPalette();
19         // 自定义颜色,可放置位置从8到63
20         palette.setColorAtIndex((short) 10, (byte) 12, (byte) 222, (byte) 123);
21     }
22
23     static {
24         initWorkbookPalette(workbook);
25     }
26
27     public static CellStyle getDefaultCellStyle() {
28         if (null == defaultCellStyle) {
29             defaultCellStyle = workbook.createCellStyle();
30             defaultCellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
31             //设置前景色,使用的颜色是从调色板选取的
32             defaultCellStyle.setFillForegroundColor((short) 10);
33         }
34
35         return defaultCellStyle;
36     }
37
38     public static Font getDefaultFont()
39     {
40         if(null == defaultFont)
41         {
42             defaultFont = workbook.createFont();
43             defaultFont.setItalic(true);
44         }
45
46         return defaultFont;
47     }
48 }
时间: 2024-09-30 16:25:43

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

【web开发】☆★之利用POI操作Excel表格系列教程【8】设置单元格对其方式

[web开发]☆★之利用POI操作Excel表格系列教程[8]设置单元格对其方式 package csg.xiaoye.poidemo; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HS

【web开发】☆★之利用POI操作Excel表格系列教程【9】单元格边框处理

[web开发]☆★之利用POI操作Excel表格系列教程[9]单元格边框处理 package csg.xiaoye.poidemo; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.a

【web开发】☆★之利用POI操作Excel表格系列教程【10】单元格填充色和颜色操作

[web开发]☆★之利用POI操作Excel表格系列教程[10]单元格填充色和颜色操作 package csg.xiaoye.poidemo; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import

【web开发】☆★之利用POI操作Excel表格系列教程【11】单元格合并

[web开发]☆★之利用POI操作Excel表格系列教程[11]单元格合并 package csg.xiaoye.poidemo; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.p

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

一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel. POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现",利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能.官网:htt

(5) 如何用Apache POI操作Excel文件-----发现Apache的POI的Bug后,如何给Apache的POI报Bug?

在我上篇文章中,(4) 如何用Apache POI操作Excel文件-----发现了POI-3.12一个回归,通过测试POI-3.12的版本,我发现了一个bug,那么发现bug后,该如何处理.我们有2种处理方式,首先我们到Apache POI的bug库里面搜索,看别人有没有创建类似的bug,如果有创建的,这个是最好的结果,我们只需要关注这个bug什么时候被修复.如果没有搜索不到,这个时候我们就需要给Apache POI报bug了.那么,如何给Apache报Bug? 第一步: 打开https://

poi操作Excel工具类

在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完成的功能是:读取Excel.写入Excel.合并Excel的功能.

JAVA使用POI操作excel

这里提一下,java操作excel的组件除了apache的poi,还有jexcelapi(jxl),其中poi组件的获取地址为poi.apache.org. poi组件中常用的类有HSSFworkbook表示一个完整的excel表格,HSSFsheet表示excel中的一个工作薄,HSSFRow表示工作薄中的一行,HSSFCell表示一个单元格 下面是一个简单的写入的demo public static void main(String [] args){ try { HSSFWorkbook

POI操作Excel详解,HSSF和XSSF两种方式

HSSF方式: package com.tools.poi.lesson1; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.