`
5__1000
  • 浏览: 60122 次
  • 性别: Icon_minigender_1
  • 来自: 地球
社区版块
存档分类
最新评论

一步一步使用POI做java报表

阅读更多
原文:http://poi.apache.org/hssf/quick-guide.html

本文暂时给出一部分基础运用,其他内容待本人翻译完成之后再写出了。

创建一个新的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();

    一点废话:link.setAddress("'Target Sheet'!A1");这一句中,Target Sheet是Sheet的名字,A是Excel中的列号,1是Excel中的行号,A1表示第一行第一列。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qiudawei115/archive/2008/09/19/2952059.aspx
分享到:
评论

相关推荐

    java利用poi生成excel demo

    通过学习和使用POI,你可以轻松地生成、读取和修改Excel文件,为数据分析、报表生成和其他业务需求提供便利。在实际项目中,你还可以结合其他Java库,如Spring或QuartZ,实现定时生成和发送Excel报告的功能。

    APACHE POI EXCEL 2007导出报表

    本文将重点介绍如何使用 Apache POI 的 `XSSF` 来创建 Excel 2007 报表。 #### 二、创建 Excel 工作簿 在使用 Apache POI 创建 Excel 2007 文件之前,首先需要创建一个工作簿对象,这可以通过 `XSSFWorkbook` 类来...

    poi

    工具标签可能意味着文章介绍了将Apache POI与其他开发工具、框架或自动化流程集成的方法,比如在Spring Boot项目中使用POI生成报表,或者在持续集成(CI)环境中利用POI处理Office文档。 由于没有具体的压缩文件名列...

    poi 下列列表

    总结来说,Apache POI的`ExcelUtil.java`文件将演示如何使用Java实现Excel下拉列表,涵盖创建`Workbook`、`Sheet`,定义数据验证规则,以及将规则应用到特定单元格的过程。通过理解和实践这段代码,开发者可以更好地...

    基于poi实现的数据已excel格式导出导入(JAVA)

    在Java编程语言中,Apache POI是一个非常流行的库,它允许开发者读取、写入以及修改Microsoft Office格式的文件,尤其是...对于初学者,理解并熟练运用Apache POI的基本概念和方法,是提升Java开发能力的重要一步。

    Jakarta POI 3.0

    Jakarta POI 3.0 的出现极大地简化了Java开发者处理Office文档的工作,尤其是在服务器端的应用,如报表生成、数据导入导出等场景。它的强大功能和开源特性使其成为企业级应用中的重要组件,而3.0版本的发布标志着POI...

    java上传excel并且解析入库

    在Java开发中,上传并解析Excel文件是一种常见的需求,特别是在数据处理、报表导入或系统集成等场景。本篇文章将深入探讨如何实现这个功能,主要涉及的技术包括文件上传、Excel解析以及数据库操作。 首先,我们需要...

    Excel文件操作的poi包

    总的来说,Apache POI是Java开发者处理Excel文件的强大工具,提供了丰富的功能,无论是在数据导入导出、报表生成还是数据分析等方面都有着广泛的应用。掌握Apache POI的使用,将极大提升你的Excel文件处理能力。在...

    java实现生成下载Excel

    在Java编程环境中,生成并提供Excel文件下载是一个常见的需求,特别是在数据处理、报表生成或数据分析的应用中。要实现这一功能,通常会用到Apache POI库,这是一个强大的API,允许Java程序员创建、修改和显示...

    java实现ireport转换pdf

    iReport 是一个强大的报表设计工具,它允许用户使用 JavaServer Pages (JSP) 和 JasperReports 来创建复杂的报表模板。本项目提供的资源包括了所有必要的 jar 包和报表文件,确保在 iReport 版本 3.7.5 及以下版本...

    java中将数据和图片导出到Excel文件

    这一步需要先将图片转换为字节数组,然后使用Apache POI提供的方法将图片插入到指定的位置。 ```java import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFSheet; ...

    java实现Excel数据导入到数据库

    在Java开发中,将Excel数据导入到数据库是一项常见的任务,特别是在数据处理、报表生成或数据分析等领域。本篇文章将深入探讨如何使用Java实现这一过程,主要涉及的技术包括Java的API使用、文件读取、数据解析以及...

    java读取和导出excel

    在Java编程环境中,处理Excel文件是一项常见的任务,无论是读取现有数据还是生成新的报表。Java提供了多种库来方便开发者操作Excel文件,其中最常用的是Apache POI和JExcelAPI。本篇文章将主要聚焦于使用Apache POI...

    java之财政预算基础知识详解

    Java库如Apache POI可以用于创建Excel报表,JFreeChart则可以用于生成各种图表。通过集成数据分析工具,如Apache Spark,可以对大量预算数据进行复杂计算和预测。 七、安全性与权限控制 在处理敏感的财政信息时,...

    JAVA2ExcelDemo.

    总结起来,Java2ExcelDemo项目是一个教学实例,它涵盖了使用Java和Apache POI库创建Excel文件的基础知识,包括工作簿、工作表、行、单元格的创建,数据写入,样式设置,以及文件输出等步骤。掌握这些技能,开发者...

    java 读取excel表格 内容、图片、图片自动上传、图片上传后回调上传地址,并赋值到图片表格位置

    在Java编程环境中,处理Excel文件是一项常见的任务,特别是在数据导入导出、数据分析或者报表生成等场景。本示例主要涉及如何使用Java读取Excel表格的内容,包括文本数据和图片,并实现图片的自动上传以及上传成功后...

    jasperreports-3.7.1 jar包

    这一步通常在服务器启动时或首次使用报表时进行。 5. **报表填充**:使用JasperFillManager结合数据源填充编译好的报表模板,生成临时的JasperPrint对象。 6. **报表导出**:根据需要,使用JasperExportManager将...

    java操作Excel

    Java操作Excel是一个常见的任务,尤其在数据处理、报表生成或者数据分析等场景中。Java提供了多种库来方便我们读写Excel文件,例如Apache POI、JXL、OpenCSV等。本项目着重介绍了使用Apache POI库进行Excel操作的...

    Ireport 3.7 图文教程

    ### Ireport 3.7 图文教程:Java代码编写在Web中生成报表 #### Ireport 简介 iReport 是一款由 Java 编写的开源报表设计工具,它以其强大的功能和灵活性成为全球范围内最流行的报表设计器之一。iReport 的核心优势...

    jasperreport需要的jar包

    2. **编译报表**: 将JasperDesign文件编译成JasperReport文件,这一步是运行报表的前提。 3. **设置数据源**: 配置报表的数据源,可以是数据库查询、Java集合、XML数据等。 4. **填充报表**: 使用...

Global site tag (gtag.js) - Google Analytics