`
nmx253
  • 浏览: 24308 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

poi读取

阅读更多

大家注意,请用最新的POI开发包进行操作,版本至少要不低于3.2,这样才能顺利完成以下所有操作。POI3.2下载地址是:http://apache.freelamp.com/poi/release/bin/poi-bin-3.2-FINAL-20081019.tar.gz

 

创建一个新的Workbook

    HSSFWorkbook wb = new HSSFWorkbook();

    FileOutputStream fileOut = new FileOutputStream("c://workbook.xls");

    wb.write(fileOut);

    fileOut.close();

                   

创建一个新的 Sheet

    HSSFWorkbook wb = new HSSFWorkbook();

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

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

    FileOutputStream fileOut = new FileOutputStream("c://workbook.xls");

    wb.write(fileOut);

    fileOut.close();

                   

创建单元格 Cells

    HSSFWorkbook wb = new HSSFWorkbook();

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

 

// 创建一个行row同时在上面设置一些单元格,注意,行是从0开始,这里创建第一行。

HSSFRow row = sheet.createRow((short)0);

    // 创建单元格并为他设置一个值,注意,单元格也是从0开始

    HSSFCell cell = row.createCell((short)0);

    cell.setCellValue(1);

 

    // 可以在同一行创建多个单元格.

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

    row.createCell((short)2).setCellValue("This is a string");

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

 

    // 将这些数据输出为Excel

    FileOutputStream fileOut = new FileOutputStream("c://workbook.xls");

    wb.write(fileOut);

    fileOut.close();

                   

创建关于时间的单元格 Cells

    HSSFWorkbook wb = new HSSFWorkbook();

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

 

    //创建一个行row同时在上面设置一些单元格,注意,行是从0开始,这里创建第一行

    HSSFRow row = sheet.createRow((short)0);

 

    // 创建一个单元格并为其设置时间值,第一个单元格是原始时间值Double类型,没有格式

    HSSFCell cell = row.createCell((short)0);

    cell.setCellValue(new Date());

 

    // 现在将第二个单元格格式化为日期+时间.

// 通过workbook创建一个新的单元格风格(cell style)是很重要的   

// 否则你在修改这个单元格的风格的时候可能会影响到其他单元格的风格。

HSSFCellStyle cellStyle = wb.createCellStyle();

    cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));

    cell = row.createCell((short)1);

    cell.setCellValue(new Date());

    cell.setCellStyle(cellStyle);

 

    // 写出文件

    FileOutputStream fileOut = new FileOutputStream("c://workbook.xls");

    wb.write(fileOut);

    fileOut.close();

                   

操作不同类型的单元格

    HSSFWorkbook wb = new HSSFWorkbook();

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

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

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

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

    row.createCell((short) 2).setCellValue("a string");

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

    row.createCell((short) 4).setCellType(HSSFCell.CELL_TYPE_ERROR);

 

    // 写出文件

    FileOutputStream fileOut = new FileOutputStream("c://workbook.xls");

    wb.write(fileOut);

fileOut.close();

//一点废话:由此可见,在上面的关于日期的格式化我们不一定要通过poi来做,我们可以将数据都格式化好了以后,转换成String类型来写入Excel,这样从一定程度上统一写入单元格的代码,实现代码复用。

                   

示范不同的队列选项(也就是单元格内容居左、居右等等)

    public static void main(String[] args)

            throws IOException

    {

        HSSFWorkbook wb = new HSSFWorkbook();

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

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

        createCell(wb, row, (short) 0, HSSFCellStyle.ALIGN_CENTER);

        createCell(wb, row, (short) 1, HSSFCellStyle.ALIGN_CENTER_SELECTION);

        createCell(wb, row, (short) 2, HSSFCellStyle.ALIGN_FILL);

        createCell(wb, row, (short) 3, HSSFCellStyle.ALIGN_GENERAL);

        createCell(wb, row, (short) 4, HSSFCellStyle.ALIGN_JUSTIFY);

        createCell(wb, row, (short) 5, HSSFCellStyle.ALIGN_LEFT);

        createCell(wb, row, (short) 6, HSSFCellStyle.ALIGN_RIGHT);

 

        // 写入文件

        FileOutputStream fileOut = new FileOutputStream("c://workbook.xls");

        wb.write(fileOut);

        fileOut.close();

 

    }

 

    /**

     * 创建一个单元格使其按照某种方式排列

     *

     * @param wb        the workbook

     * @param row       生成单元格的行

     * @param column    在这个行中单元格所处的列数

     * @param align     单元格内容的排列方式.

     */

    private static void createCell(HSSFWorkbook wb, HSSFRow row, short column, short align)

    {

        HSSFCell cell = row.createCell(column);

        cell.setCellValue("Align It");

        HSSFCellStyle cellStyle = wb.createCellStyle();

        cellStyle.setAlignment(align);

        cell.setCellStyle(cellStyle);

    }

                   

操作边框

    HSSFWorkbook wb = new HSSFWorkbook();

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

 

    // 创建一行(row)并为其设置单元格,行从0开始.

    HSSFRow row = sheet.createRow((short) 1);

 

    // 创建单元格并为其设置数值.

    HSSFCell cell = row.createCell((short) 1);

    cell.setCellValue(4);

 

    // 在单元格周围设置边框.

    HSSFCellStyle style = wb.createCellStyle();

    style.setBorderBottom(HSSFCellStyle.BORDER_THIN);

    style.setBottomBorderColor(HSSFColor.BLACK.index);

    style.setBorderLeft(HSSFCellStyle.BORDER_THIN);

    style.setLeftBorderColor(HSSFColor.GREEN.index);

    style.setBorderRight(HSSFCellStyle.BORDER_THIN);

    style.setRightBorderColor(HSSFColor.BLUE.index);

    style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM_DASHED);

    style.setTopBorderColor(HSSFColor.BLACK.index);

    cell.setCellStyle(style);

 

    // 写入文件

    FileOutputStream fileOut = new FileOutputStream("c://workbook.xls");

    wb.write(fileOut);

    fileOut.close();

                   

迭代遍历行及其单元格

有时,我们喜欢遍历一个Sheet的所有行,或者一行的所有单元格,这时可以通过循环来遍历还是比较简单的。

幸运的是,我们这有个非常简单的方法。HSSFRow定义了一个CellIterator的内部类来迭代遍历所有的单元格(通过调用row.celIterator获取),而且HSSFSheet也提供了一个rowIterator方法给出了遍历所有行的迭代器。

(Unfortunately, due to the broken and backwards-incompatible way that Java 5 foreach loops were implemented, it isn't possible to use them on a codebase that supports Java 1.4, as POI does)

         HSSFSheet sheet = wb.getSheetAt(0);

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

                 HSSFRow row = (HSSFRow)rit.next();

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

                          HSSFCell cell = (HSSFCell)cit.next();

                          // Do something here

                 }

         }

                                  

         HSSFSheet sheet = wb.getSheetAt(0);

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

                 HSSFRow row = rit.next();

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

                          HSSFCell cell = cit.next();

                          // Do something here

                 }

         }

               

使用java5的特有的前端循环(foreach loops)遍历行和单元格- OOXML Branch Only

有时候我们需要遍历一个Sheet的所有行或者一行的所有列,这时如果使用java5或者更高版本的话,可以采用这种新的循环方式的处理。

幸运的是,这也非常简单。HSSFSheet和HSSFRow都实现了java.lang.Iterator接口来允许新的循环方式的运行。HSSFRow允许通过CellIterator内部类来处理单元格的循环,HSSFSheet给出了rowIterator方法来遍历所有的行。

         HSSFSheet sheet = wb.getSheetAt(0);

         for (HSSFRow row : sheet.rowIterator()) {

                 for (HSSFCell cell : row.cellIterator()) {

                          // Do something here

                 }

         }

               

内容提取

对于大多数的内容提取需求,标准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();

填充和颜色

    HSSFWorkbook wb = new HSSFWorkbook();

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

 

    // 创建一行,并为其设置单元格,行从0开始 .

    HSSFRow row = sheet.createRow((short) 1);

 

    // Aqua 背景色

    HSSFCellStyle style = wb.createCellStyle();

    style.setFillBackgroundColor(HSSFColor.AQUA.index);

    style.setFillPattern(HSSFCellStyle.BIG_SPOTS);

    HSSFCell cell = row.createCell((short) 1);

    cell.setCellValue("X");

    cell.setCellStyle(style);

 

    // Orange "前景色".

    style = wb.createCellStyle();

    style.setFillForegroundColor(HSSFColor.ORANGE.index);

    style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

    cell = row.createCell((short) 2);

    cell.setCellValue("X");

    cell.setCellStyle(style);

 

    // 写入文件

    FileOutputStream fileOut = new FileOutputStream("c://workbook.xls");

    wb.write(fileOut);

    fileOut.close();

                   

合并单元格

    HSSFWorkbook wb = new HSSFWorkbook();

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

 

    HSSFRow row = sheet.createRow((short) 1);

    HSSFCell cell = row.createCell((short) 1);

    cell.setCellValue("This is a test of merging");

 

    sheet.addMergedRegion(new Region(1,(short)1,1,(short)2));

 

    // 写入文件

    FileOutputStream fileOut = new FileOutputStream("c://workbook.xls");

    wb.write(fileOut);

    fileOut.close();

一点废话:关于new Region(1,(short)1,1,(short)2):四个参数分别为起始行、起始列、终止行、终止列,如果要在合并的单元格中写入数据,首先在起始行列的单元格中写入内容,之后从起始行列处开始拉伸合并单元格到终止行列。

字体设置

    HSSFWorkbook wb = new HSSFWorkbook();

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

 

    //创建行

    HSSFRow row = sheet.createRow((short) 1);

 

    // 创建一个系的呢字体并设置其属性.

    HSSFFont font = wb.createFont();

    font.setFontHeightInPoints((short)24);

    font.setFontName("Courier New");

    font.setItalic(true);

    font.setStrikeout(true);

 

    // 字体设置给一个HSSFCellStyle对象.

    HSSFCellStyle style = wb.createCellStyle();

    style.setFont(font);

 

    // 创建一个单元格并为其设置值

    HSSFCell cell = row.createCell((short) 1);

    cell.setCellValue("This is a test of fonts");

    cell.setCellStyle(style);

 

    //写入文件

    FileOutputStream fileOut = new FileOutputStream("c://workbook.xls");

    wb.write(fileOut);

    fileOut.close();

 

注意:一个workbook中字体数目被限制在32767个以内。你应该在程序中重用字体来代替为每个单元格创建新字体

下面写法是错误的:

        for (int i = 0; i < 10000; i++) {

            HSSFRow row = sheet.createRow(i);

            HSSFCell cell = row.createCell((short) 0);

 

            HSSFCellStyle style = workbook.createCellStyle();

            HSSFFont font = workbook.createFont();

            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

            style.setFont(font);

            cell.setCellStyle(style);

        }

修正后:

 

        HSSFCellStyle style = workbook.createCellStyle();

        HSSFFont font = workbook.createFont();

        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

        style.setFont(font);

        for (int i = 0; i < 10000; i++) {

            HSSFRow row = sheet.createRow(i);

            HSSFCell cell = row.createCell((short) 0);

            cell.setCellStyle(style);

        }

一点废话:将创建字体的代码移出循环体。

 

如何读取超链接

    HSSFSheet sheet = workbook.getSheetAt(0);

 

    HSSFCell cell = sheet.getRow(0).getCell((short)0);

    HSSFHyperlink link = cell.getHyperlink();

    if(link != null){

        System.out.println(link.getAddress());

    }

如何设置超链接

    HSSFWorkbook wb = new HSSFWorkbook();

 

    //超链接的单元格风格

    //超链接默认的是蓝色底边框

    HSSFCellStyle hlink_style = wb.createCellStyle();

    HSSFFont hlink_font = wb.createFont();

    hlink_font.setUnderline(HSSFFont.U_SINGLE);

    hlink_font.setColor(HSSFColor.BLUE.index);

    hlink_style.setFont(hlink_font);

 

    HSSFCell cell;

    HSSFSheet sheet = wb.createSheet("Hyperlinks");

 

    //URL

    cell = sheet.createRow(0).createCell((short)0);

    cell.setCellValue("URL Link");

    HSSFHyperlink link = new HSSFHyperlink(HSSFHyperlink.LINK_URL);

    link.setAddress("http://poi.apache.org/");

    cell.setHyperlink(link);

    cell.setCellStyle(hlink_style);

 

    //链接到当前路径的一个文件

    cell = sheet.createRow(1).createCell((short)0);

    cell.setCellValue("File Link");

    link = new HSSFHyperlink(HSSFHyperlink.LINK_FILE);

    link.setAddress("link1.xls");

    cell.setHyperlink(link);

    cell.setCellStyle(hlink_style);

 

    //链接到e-mail

    cell = sheet.createRow(2).createCell((short)0);

    cell.setCellValue("Email Link");

    link = new HSSFHyperlink(HSSFHyperlink.LINK_EMAIL);

    //note, if subject contains white spaces, make sure they are url-encoded

    link.setAddress("mailto:poi@apache.org?subject=Hyperlinks");

    cell.setHyperlink(link);

    cell.setCellStyle(hlink_style);

 

    //链接到 workbook的某个地方

 

    //创建一个目标Sheet和单元格

    HSSFSheet sheet2 = wb.createSheet("Target Sheet");

    sheet2.createRow(0).createCell((short)0).setCellValue("Target Cell");

 

    cell = sheet.createRow(3).createCell((short)0);

    cell.setCellValue("Worksheet Link");

    link = new HSSFHyperlink(HSSFHyperlink.LINK_DOCUMENT);

    link.setAddress("'Target Sheet'!A1");

    cell.setHyperlink(link);

    cell.setCellStyle(hlink_style);

 

    FileOutputStream out = new FileOutputStream("c://hssf-links.xls");

    wb.write(out);

    out.close();

分享到:
评论

相关推荐

    POI读取 word 2003 和 word 2007 的例子

    这是一个POI读取word 2003 和 word 2007的例子 是一个Eclipse工程 下载后直接导入工程 运行 src 目录下的 Test java 类即可 这个 rar 包中包含着 POI 读取word 2003 和 word 2007 所需要的 jar 包 也有需要读取的 ...

    利用POI读取excel写入到word

    要实现"利用POI读取excel写入到word",我们需要以下步骤: 1. **准备环境**:首先,确保你的项目已经引入了Apache POI的依赖。在给定的压缩包中,"poi - 副本"可能是包含POI库的JAR文件,你需要将其添加到你的项目...

    [简单]poi读取word 2007简单文本框值

    标题中的“poi读取word 2007简单文本框值”指的是使用Apache POI库来读取Microsoft Word 2007文档中简单文本框内的文本内容。Apache POI是一个流行的开源Java库,用于处理Microsoft Office格式的文件,如Word(.docx...

    JAVA-POI读取word每一段所在页码(附依赖jar包).zip

    我给出了代码和所有的解释,用POI读取word中的页码。也算是小方法了,基本很准确,为什么要加一个基本呢?因为,分页标志符号在第一行为空白行的时候没有分页符!!所以你的文档如果有很多首段空白行的话,不要浪费C...

    poi读取合并单元格帮助类

    在探讨“poi读取合并单元格帮助类”的知识点时,我们首先需要理解Apache POI库在Java中的作用以及如何处理Excel文件中的合并单元格。Apache POI是一个开源的API,它允许程序创建、修改和显示Microsoft Office格式的...

    poi读取excel文件

    标题提到的"poi读取excel文件",指的是使用Apache POI库来处理Excel数据。在最新的版本中,POI引入了更高效和强大的功能,使得处理Excel文件变得更加方便。 描述中提到了"最新版poi相关的6个jar包",这些jar包是...

    android POI 读取excel 精简jar

    Apache POI提供对Microsoft Office格式的全面支持,包括Excel的.xlsx格式。此精简版可能是为了减小Android应用的体积和提高性能,移除了不必要的部分,但仍保留了读取Excel文件的核心功能。 3. **aa-poi-ooxml-...

    POI读取Excel包.rar

    这个"POI读取Excel包.rar"的压缩文件很可能包含了POI库的相关jar文件,以及可能的示例代码或教程,帮助用户学习如何使用POI来读取Excel数据。 POI项目始于2001年,它的主要功能是允许Java应用程序创建、修改和显示...

    POI读取2007 Excel文件

    标题中的“POI读取2007 Excel文件”指的是使用Apache POI库来解析和操作Microsoft Office Open XML (OOXML)格式的Excel文件,这种格式通常以.xlsx为扩展名。Apache POI是一个流行的Java库,它允许开发人员在Java应用...

    poi读取xlsx和xls

    标题中的“poi读取xlsx和xls”指的是使用Apache POI库来处理Microsoft Office的两种不同文件格式:Excel的.xlsx(基于OpenXML标准)和.xls(基于老版的BIFF格式)。Apache POI是一个流行的Java库,它允许开发人员在...

    linux下poi读取word空指针异常问题解决

    ### Linux下使用POI读取Word文件出现空指针异常问题解决方案 #### 问题背景 在使用Apache POI处理Word文档时,在Linux环境下遇到了`java.lang.NullPointerException`异常。异常的具体位置出现在`org.apache.poi....

    使用poi读取、写入复杂excel工具类(包含样式)

    使用poi读取写入复杂excel内容包括样式,工具类

    poi读取excel并输出到jsp页面

    标题中的“poi读取excel并输出到jsp页面”是指使用Apache POI库来处理Microsoft Excel文件,并将数据在JavaServer Pages (JSP) 页面上显示的技术。Apache POI 是一个开源项目,它允许开发者创建、修改和显示MS ...

    poi读取excel所需jar(完整版)及poi api

    这个“poi读取excel所需jar(完整版)”压缩包应该包含了所有处理Excel所需的POI库文件,确保你可以顺利地在Java项目中进行Excel操作。记得根据你的项目需求选择合适的版本,保持库的更新,以利用最新的特性与修复。

    poi读取Excel2007文件

    标题中的“poi读取Excel2007文件”指的是使用Apache POI库来处理Microsoft Office Open XML (OOXML) 格式的Excel文件,也就是.xlsx格式。Apache POI是Apache软件基金会的一个开源项目,它提供了Java API,使得开发者...

    poi读取excel的jar包

    标题中的"poi读取excel的jar包"指的是Apache POI库的一个版本,它包含了读取Excel 2007文件所需的类和方法。在Java程序中,引入这个jar包后,开发者可以编写代码来处理.xlsx文件,无论是读取数据、解析工作表还是...

    android 使用poi读取高版本excel

    android 使用poi读取高版本excel, 解决以下这两个错误 java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/xml/stream/XMLEventFactory; at org.apache.poi.openxml4j.opc.internal.marshallers....

    poi读取Excel用到的jar包

    标题提到的“poi读取Excel用到的jar包”指的是在Java项目中使用POI库进行Excel操作所需引入的依赖文件。这些jar包在描述中给出,包括了以下几个: 1. poi-ooxml-schemas-3.8-beta5-20111217.jar:这个文件包含了...

    java Apache poi 对word doc文件进行读写操作

    例如,你可以获取 `HWPFDocument` 中的所有段落,然后对每个段落的字体、字号进行操作。 **写入 Word .doc 文件**: 写入 Word 文件涉及到创建新的 `HWPFDocument` 实例,添加 `Section`、`Paragraph` 和 `...

    POI读取Excel带格式数据

    本篇将详细讲解如何使用Apache POI读取Excel文件中的带格式数据。 首先,理解Apache POI的基本架构至关重要。POI提供了HSSF(Horrible Spreadsheet Format)用于处理老版本的.xls文件,而XSSF用于处理较新的.xlsx...

Global site tag (gtag.js) - Google Analytics