[翻译]POI3.5 HSSF 和XSSF Excel操作快速入门手册 1[附下载]

写在前面

想尽快的使用HSSFXSSF对电子表格进行操作吗?这个指南正是您所需要的。现在稳定的POI的版本为3.6。但最近在查阅POI的资料时发现,虽然资料很多,但是大都局限于2.x的版本,3.x中文资料比较少,查阅apache网站的时候发现了这份文档,看着不错,就翻译了一下,希望能够对大家有所帮助。由于时间仓促难免有翻译不当之处,还望不吝赐教,费神指正,感激不尽!

                                                     岑坚(高凯)

                                                   [email protected]

                                                    2010-08-08

目录

添加POI支持... 5

创建新工作簿... 5

创建新sheet... 5

创建单元格... 5

新建一个时间格式的单元格... 6

处理不同内容格式的单元格... 7

遍历列和单元格... 7

获得单元格内的内容... 8

文本提取... 9

处理单元格边框... 10

填充色和颜色操作... 11

合并单元格... 12

字体的处理... 12

自定义颜色... 14

读取和重写工作簿... 15

在单元格中使用换行... 15

创建用户自定义数据格式... 16

Sheet页自适应页面大小... 17

设定打印区域... 17

设置脚注页码... 18

使用便捷函数... 18

上下移动一行... 19

将sheet页设定为默认选中... 19

设置sheet页放大倍率... 20

拆分和冻结窗格... 20

重复列和行... 21

页眉和页脚... 21

绘制图形... 22

设置图形样式... 23

图形和Graphics2d... 24

提纲... 25

图像处理... 26

关联范围和关联单元格... 27

为单元格添加注释... 30

根据内容调整单元格的宽度... 31

超级链接... 31

数据验证... 33

嵌入其他资源对象... 35

 

 

 

添加POI支持

 

鉴于现在大部分应用是以Maven作为构建,可在pom.xml中加入POImaven依赖,但是maven现在只支持到3.1版本,对3.5版本还不提供支持。

<dependency>

<groupId>poi</groupId>

   <artifactId>poi</artifactId>

   <version>3.1-FINAL</version>

</dependency>

 

因此可以直接在Apache 官网下载POI3.5版本,作为reference library加入工程中

创建新工作簿

Workbook wb = new HSSFWorkbook();

    FileOutputStream fileOut = new FileOutputStream("workbook.xls");

    wb.write(fileOut);

    fileOut.close();

 

    Workbook wb = new XSSFWorkbook();

FileOutputStream fileOut = new FileOutputStream("workbook.xlsx");

    wb.write(fileOut);

fileOut.close();

 

创建新sheet页

    Workbook wb = new HSSFWorkbook();

    //Workbook wb = new XSSFWorkbook();

    Sheet sheet1 = wb.createSheet("new sheet");

    Sheet sheet2 = wb.createSheet("second sheet");

    FileOutputStream fileOut = new FileOutputStream("workbook.xls");

    wb.write(fileOut);

    fileOut.close();

 

创建单元格

    Workbook wb = new HSSFWorkbook();

    //Workbook wb = new XSSFWorkbook();

    CreationHelper createHelper = wb.getCreationHelper();

    Sheet sheet = wb.createSheet("new sheet");

 

//创建一列,在其中加入多个单元格,列索引号从0开始,单元格的索引号也是从0

//开始

    Row row = sheet.createRow((short)0);[1]

    //创建一个单元格,并在其中加入内容.

    Cell cell = row.createCell(0);

    cell.setCellValue(1);

 

    // 上面的多行代码可以采用下面的一行代码的方式完成

    row.createCell(1).setCellValue(1.2);

    row.createCell(2).setCellValue(

         createHelper.createRichTextString("This is a string"));

    row.createCell(3).setCellValue(true);

 

    //将输出流写入一个文件

    FileOutputStream fileOut = new FileOutputStream("workbook.xls");

    wb.write(fileOut);

    fileOut.close();

                   

新建一个时间格式的单元格

    //Workbook wb = new XSSFWorkbook();

    CreationHelper createHelper = wb.getCreationHelper();

    Sheet sheet = wb.createSheet("new sheet");

 

   //创建一列,在其中加入多个单元格,列索引号从0开始,单元格的索引号也是从0

//开始

    Row row = sheet.createRow(0);

 

    //创建一个单元格,并在其中加入内容.  第一个单元格的内容不设置为日期时间格式

    Cell cell = row.createCell(0);

    cell.setCellValue(new Date());

 

//我们将第二个单元格设置成日期(和时间)格式。对这个文件来说创建一个新的单//元格格式非常重要,除非您能够不用内置的格式来渲染所有的单元格

    CellStyle cellStyle = wb.createCellStyle();

    cellStyle.setDataFormat(

    createHelper.createDataFormat().getFormat("m/d/yy h:mm"));

    cell = row.createCell(1);

    cell.setCellValue(new Date());

    cell.setCellStyle(cellStyle);

 

    //也可以用java.util.Calendar来设置单元格格式

    cell = row.createCell(2);

    cell.setCellValue(Calendar.getInstance());

    cell.setCellStyle(cellStyle);

 

    // 将输出流写入一个文件

    FileOutputStream fileOut = new FileOutputStream("workbook.xls");

    wb.write(fileOut);

fileOut.close();

 

处理不同内容格式的单元格

    Workbook wb = new HSSFWorkbook();

    Sheet sheet = wb.createSheet("new sheet");

    Row row = sheet.createRow((short)2);

    row.createCell(0).setCellValue(1.1);

    row.createCell(1).setCellValue(new Date());

    row.createCell(2).setCellValue(Calendar.getInstance());

    row.createCell(3).setCellValue("a string");

    row.createCell(4).setCellValue(true);

    row.createCell(5).setCellType(HSSFCell.CELL_TYPE_ERROR);

 

    //将输出流写入一个文件

    FileOutputStream fileOut = new FileOutputStream("workbook.xls");

    wb.write(fileOut);

fileOut.close();

 

遍历列和单元格

       有些时候您仅希望遍历一个sheet页中所有的列或是一列中所有的单元格。这可以用一个简单的for循环来实现。

   幸运的是,这非常简单。Row对象定义了一个CellIterator内部类用来处理单元格的遍历(可以通过调用row.cellIterator() 来获得Iterator 对象),另外,Sheet 对象提供了一个rowIterator()方法对所有列进行遍历

   除此之外,Sheet Row对象都实现了java.lang.Iterable 接口,因此如果您用的是Java 1.5 及以上版本,您可以简单的调用内置的“foreach”来实现。请看:

        Sheet sheet = wb.getSheetAt(0);

        for (Iterator<Row> rit = sheet.rowIterator(); rit.hasNext(); ) {

               Row row = rit.next();

               for (Iterator<Cell> cit = row.cellIterator(); cit.hasNext(); ) {

                       Cell cell = cit.next();

                       // Do something here

               }

        }

使用Java1.5 foreach 循环遍历列和单元格

有时候您仅希望遍历一个sheet页中所有的列或是一列中所有的单元格。如果您使用的是java1.5或是以上版本,那么这将十分的方便,因为它支持新的 foreach 循环。

幸运的是,这非常的简单。Sheet Row对象都实现了java.lang.Iterable 接口支持foreach 循环。对Row对象来说它支持通过调用CellIterator内部类用来处理单元格的遍历,对于Sheet对象来说它提供了一个rowIterator()方法对所有列进行遍历。

        Sheet sheet = wb.getSheetAt(0);

        for (Row row : sheet) {

               for (Cell cell : row) {

                       // Do something here

               }

        }

 

获得单元格内的内容

要想获得单元格内的内容,您首先要要知道单元格内容的格式(比如您想获得从字符格式的单元格内获得一个数字,您将得到的是NumberFormatException错误)。因此,您将希望能够切换到该单元格格式,然后为获得该单元格内容调用合适的getter方法。

在以下的代码中我们将对一个sheet页中的所有单元格进行遍历,并打印出单元格的引用和内容。

// import org.apache.poi.ss.usermodel.*;

 

Sheet sheet1 = wb.getSheetAt(0);

for (Row row : sheet1) {

        for (Cell cell : row) {

               CellReference cellRef = new CellReference(row.getRowNum(), cell.getCellNum());

               System.out.print(cellRef.formatAsString());

               System.out.print(" - ");

              

               switch(cell.getCellType()) {

      case Cell.CELL_TYPE_STRING:

        System.out.println(cell.getRichStringCellValue().getString());

        break;

      case Cell.CELL_TYPE_NUMERIC:

        if(DateUtil.isCellDateFormatted(cell)) {

          System.out.println(cell.getDateCellValue());

        } else {

          System.out.println(cell.getNumericCellValue());

        }

        break;

      case Cell.CELL_TYPE_BOOLEAN:

        System.out.println(cell.getBooleanCellValue());

        break;

      case Cell.CELL_TYPE_FORMULA:

        System.out.println(cell.getCellFormula());

        break;

      default:

        System.out.println();

               }

        }

}

 

文本提取

对于大多数的文本提取需求,标准的ExcelExtractor类应该能够满足您所有的需求。

        InputStream inp = new FileInputStream("workbook.xls");

        HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(inp));

        ExcelExtractor extractor = new ExcelExtractor(wb);

 

        extractor.setFormulasNotResults(true);

        extractor.setIncludeSheetNames(false);

        String text = extractor.getText();

对于特殊的文本提取,比如将xls文件内容写入csv文件,可以参考:
/src/examples/src/org/apache/poi/hssf/eventusermodel/examples/XLS2CSVmra.java
文件

单元格的各种对齐方式

    public static void main(String[] args)  throws Exception {

        Workbook wb = new XSSFWorkbook(); //或者是 new HSSFWorkbook();

 

        Sheet sheet = wb.createSheet();

        Row row = sheet.createRow((short) 2);

        row.setHeightInPoints(30);

 

        createCell(wb, row, (short) 0, XSSFCellStyle.ALIGN_CENTER, XSSFCellStyle.VERTICAL_BOTTOM);

        createCell(wb, row, (short) 1, XSSFCellStyle.ALIGN_CENTER_SELECTION, XSSFCellStyle.VERTICAL_BOTTOM);

        createCell(wb, row, (short) 2, XSSFCellStyle.ALIGN_FILL, XSSFCellStyle.VERTICAL_CENTER);

        createCell(wb, row, (short) 3, XSSFCellStyle.ALIGN_GENERAL, XSSFCellStyle.VERTICAL_CENTER);

        createCell(wb, row, (short) 4, XSSFCellStyle.ALIGN_JUSTIFY, XSSFCellStyle.VERTICAL_JUSTIFY);

        createCell(wb, row, (short) 5, XSSFCellStyle.ALIGN_LEFT, XSSFCellStyle.VERTICAL_TOP);

        createCell(wb, row, (short) 6, XSSFCellStyle.ALIGN_RIGHT, XSSFCellStyle.VERTICAL_TOP);

 

        //将输出流写入一个文件

        FileOutputStream fileOut = new FileOutputStream("xssf-align.xlsx");

        wb.write(fileOut);

        fileOut.close();

 

    }

 

    /**

     *创建一个单元格并为其设定指定的对齐方式.

     *

     * @param wb       工作簿

     * @param row     单元格所在的列

     * @param column 单元格所在的行索引号

     * @param halign 单元格的水平对齐方式.

     */

    private static void createCell(Workbook wb, Row row, short column, short halign, short valign) {

        Cell cell = row.createCell(column);

        cell.setCellValue(new XSSFRichTextString("Align It"));

        CellStyle cellStyle = wb.createCellStyle();

        cellStyle.setAlignment(halign);

        cellStyle.setVerticalAlignment(valign);

        cell.setCellStyle(cellStyle);

    }

                   

如何处理边框

    Workbook wb = new HSSFWorkbook();

    Sheet sheet = wb.createSheet("new sheet");

 

   //创建一列,在其中加入多个单元格,列索引号从0开始,单元格的索引号也是从0

//开始.

    Row row = sheet.createRow(1);

 

    //创建一个单元格,并在其中加入内容.

    Cell cell = row.createCell(1);

    cell.setCellValue(4);

 

    //设置单元格边框为四周环绕.

    CellStyle style = wb.createCellStyle();

    style.setBorderBottom(CellStyle.BORDER_THIN);

    style.setBottomBorderColor(IndexedColors.BLACK.getIndex());

    </

 

我的博客地址:www.aitawo.com

你可能感兴趣的:(apache,maven,Excel,aitawo.com)