zoukankan      html  css  js  c++  java
  • 使用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 }
  • 相关阅读:
    Linux 下配置多路径及SCSI扫描磁盘重新发现大小
    vSphere vSwitch网络属性配置详解
    勤动脑筋
    如何用visual studio2013编写简单C语言程序
    两个字符窜,在母窜中查找子窜的位置
    如何安装Microsoft Visual C++6.0
    看张子阳如何在30岁前年薪超过30万觉得很有道理几点
    标志位放错了位置
    注意细节
    探索式学习
  • 原文地址:https://www.cnblogs.com/kingsleylam/p/5361365.html
Copyright © 2011-2022 走看看