`
micc010
  • 浏览: 72519 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

Apache poi

阅读更多
java 代码
1.生成(Excel)Workbook对象  
    创建HSSFWorkbook对象  
    创建 HSSFSheet 对象  
    创建HSSFRow对象  
    创建HSSFCell对象  
 
2.将Workbook对象写入文件  
 
   
FileOutputStream fout = new FileOutputStream("t" + "sfname");  //文件名   
    ewb.write(fout);              
    fout.close();  
  
  
  
//create new excel file and return the file's name   
    public String getMyExcel(String strsql) {   
        String sfname = "";   
        sfname = this.getUniqueFilename();   
  
        if (null == sfname || sfname.trim().equals("")) {   
            return ""; //error:getUniqueFilename failed.   
        }   
  
        //strsql = "select aac001,aac002,aac003,aac004,aae036 from ac01 where datediff(yy,aae036,getdate()) = 0 ";    
        if (null == strsql || strsql.trim().equals("")) {   
            return ""; //   
        }   
  
        Connection conn = null;   
        PreparedStatement pst = null;   
        ResultSet rs = null;   
  
        try {   
            conn = getConnection();   
            pst = conn.prepareStatement(strsql);   
            rs = pst.executeQuery();   
  
            if (null == rs) {   
                return ""; //error.   
            }   
  
            boolean bHave = rs.next();   
            if (!bHave) {   
                return ""; //no record.   
            }   
  
            HSSFWorkbook ewb = new HSSFWorkbook();   
            HSSFSheet esh = ewb.createSheet("list01");   
            HSSFRow erow = null;   
            HSSFCell ecell = null;   
  
            //HSSFFont   
            HSSFFont numFont = ewb.createFont();   
            //font.setFontHeightInPoints((short)24);   
            numFont.setFontName("Courier New");   
  
            //song   
            HSSFFont font = ewb.createFont();   
            font.setFontHeightInPoints( (short) 12);   
            font.setFontName("宋体");   
            //font.setItalic(true);   
  
            // Fonts are set into a style so create a new one to use.   
            HSSFCellStyle style = ewb.createCellStyle();   
            style.setFont(font);   
  
            //HSSFCellStyle   
            HSSFCellStyle cellNumStyle = ewb.createCellStyle();   
            cellNumStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);   
            cellNumStyle.setFont(font);   
            cellNumStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0"));   
           //HSSFDataFormat df = wb.createDataFormat();   
          //style.setDataFormat(df.getFormat("#,##0.00"));   
  
            HSSFCellStyle cellTxtStyle = ewb.createCellStyle();   
            cellTxtStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT);   
            cellTxtStyle.setFont(font);   
            cellTxtStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("text"));   
  
            HSSFCellStyle cellDateStyle = ewb.createCellStyle();   
            cellDateStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT);   
            cellDateStyle.setFont(font);   
            cellDateStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat(   
                "m/d/yy h:mm"));   
  
            int currow = 0; //当前行   
  
            //生成列标题   
            int colNum = 0; //列   
            ResultSetMetaData rsmd = rs.getMetaData();   
            colNum = rsmd.getColumnCount();   
  
            erow = esh.createRow(currow++); //标题行   
            for (short j = 0; j < colNum; j++) {   
                ecell = erow.createCell(j);   
                ecell.setEncoding(HSSFCell.ENCODING_UTF_16);   
                ecell.setCellValue(rsmd.getColumnName(j + 1));   
                ecell.setCellStyle(cellTxtStyle);   
  
            }   
  
            //详细列表   
            while (bHave) { //get row.   
  
                //create row.   
                erow = esh.createRow(currow);   
  
                for (short i = 0; i < colNum; i++) {   
                    int dataType = rsmd.getColumnType(i + 1);   
  
                    //create cell.   
                    ecell = erow.createCell(i);   
                    ecell.setEncoding(HSSFCell.ENCODING_UTF_16);   
  
                    switch (dataType) {   
                        case Types.NUMERIC:   
                            ecell.setCellValue(rs.getDouble(i + 1));   
                            ecell.setCellStyle(cellNumStyle);   
                            break;   
                        case Types.CHAR:   
                        case Types.LONGVARCHAR:   
                        case Types.VARCHAR:   
                            ecell.setCellValue(rs.getString(i + 1));   
                            ecell.setCellStyle(cellTxtStyle);   
                            break;   
                        case Types.DATE:   
                            ecell.setCellValue(rs.getDate(i + 1));   
                            ecell.setCellStyle(cellDateStyle);   
                            break;   
                        case Types.TIME:   
                            ecell.setCellValue(rs.getTime(i + 1));   
                            ecell.setCellStyle(cellDateStyle);   
                            break;   
                        case Types.TIMESTAMP:   
                            ecell.setCellValue(rs.getTimestamp(i + 1));   
                            ecell.setCellStyle(cellDateStyle);   
                            break;   
                        default:   
                            ecell.setCellValue(rs.getString(i + 1));   
                            ecell.setCellStyle(cellTxtStyle);   
  
                    }   
                }   
  
                bHave = rs.next();   
                currow++;   
            }   
  
            FileOutputStream fout = new FileOutputStream("t" + "sfname");              
            ewb.write(fout);              
            fout.close();             
        }   
        catch (Exception sqle) {   
            //   
            sqle.printStackTrace();   
            return "";   
        }   
        finally {   
            try {   
                if (null != rs) {   
                    rs.close();   
                    rs = null;   
                }   
  
                if (null != pst) {   
                    pst.close();   
                    pst = null;   
                }   
                if (null != conn) {   
                    conn.close();   
                    conn = null;   
                }   
  
            }   
            catch (Exception exx) {   
                //   
            }   
        }   
  
        return sfname;   
    }   



设置单元格样式
HSSFCellStyle类代表一种单元格样式。可以通过这个类来设置单元格的边框样式、背景颜色、字体、水平和垂直对齐方式等等。

HSSFCellStyle titleStyle = workbook.createCellStyle();
  titleStyle.setBorderBottom(HSSFCellStyle.BORDER_DOUBLE);
  titleStyle.setBorderLeft((short)1);
  titleStyle.setBorderRight((short)1);
  titleStyle.setBorderTop(HSSFCellStyle.BORDER_DOUBLE);
  titleStyle.setFillForegroundColor(HSSFColor.LIGHT_ORANGE.index);
  titleStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);


注意:如果我们定义了一种样式,把它赋给一些单元格。然后基于新的需要,更改该样式中的某个属性,再赋给另一些单元格。那么之前单元格样式的该属性也会被同时更改。
比如我们定义了样式,设置单元格背景色为红色:

HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setFillForegroundColor(HSSFColor.RED.index);
cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);


然后把它赋给一个单元格:

HSSFCell cell1 = row.createCell((short)1);
cell1.setCellStyle(cellStyle);


然后更改样式中的背景色属性为蓝色:

cellStyle.setFillForegroundColor(HSSFColor.BLUE.index);


然后赋给另一个单元格:

HSSFCell cell2 = row.createCell((short)2);
cell2.setCellStyle(cellStyle);


想当然,我们预计在最终结果中cell1的背景色为红色,cell2的背景色为蓝色。但是结果是:两个单元格的背景色都变成了蓝色。

遇到这种情况,要预先定义两种不同的单元格样式。

当一个EXCEL文件同时需要很多大同小异的单元格样式时,这样一一定义很麻烦。POI HSSF提供了一个HSSFCellUtil类(在org.apache.poi.hssf.usermodel.contrib包),里面有几个方法可以绕过HSSFCellStyle直接设定单元格的样式,但这几个方法会抛出NestableException异常,要处理这个异常,需要引用Apache的几个Common包:
commons-beanutils.jar
commons-beanutils-bean-collections.jar
commons-beanutils-core.jar
commons-lang.jar
commons-logging-api.jar


合并单元格
HSSFSheet.addMergedRegion(new Region())方法可以合并单元格,Region()中的一个构造函数含有四个参数,分别代表起始行、起始列、结束行、结束列:
sheet.addMergedRegion(new Region(startRow,startCell,endRow,endCell)));


处理公式

HSSFCell.setCellFormula()方法用来在EXCEL单元格中写入公式。
   cell = row.createCell((short)(dataFlag));
   cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
   cell.setCellFormula("SUM("A1:D1")");
   cell.setCellStyle(nameStyle);


处理链接

在POI中往单元格中写链接,是用HYPERLINK函数搞定的。
HYPERLINK函数包含两个参数,第一个参数是指向的URL地址,第二个参数是显示字串。

  
cell = row.createCell((short)(dataFlag));
   cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
   cell.setCellFormula("HYPERLINK('链接地址http...')");
   cell.setCellStyle(linkStyle);


为了使链接效果更好,我们可以给链接所在单元格定义一种样式,使链接显示为有下划线的蓝色字串:

 HSSFCellStyle linkStyle = workbook.createCellStyle();
  linkStyle.setBorderBottom((short)1);
  linkStyle.setBorderLeft((short)1);
  linkStyle.setBorderRight((short)1);
  linkStyle.setBorderTop((short)1);
  linkStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
  linkStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  HSSFFont font = workbook.createFont();
  font.setFontName(HSSFFont.FONT_ARIAL);
  font.setUnderline((byte)1);
  font.setColor(HSSFColor.BLUE.index);
  linkStyle.setFont(font);


中文处理:

要在通过POI生成的EXCEL中正常显示中文,需要为单元格设置编码:

cell.setEncoding(HSSFCell.ENCODING_UTF_16); 
  cell.setCellValue("部门");
Java使用HSSF读取Excel表中公式列的方法
FileInputStream fis = new FileInputStream("c:/temp/test.xls");
HSSFWorkbook wb = new HSSFWorkbook(fis);
HSSFSheet sheet = wb.getSheetAt(0);
HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet, wb);

// suppose your formula is in B3
CellReference cellReference = new CellReference("B3"); 
HSSFRow row = sheet.getRow(cellReference.getRow());
HSSFCell cell = row.getCell(cellReference.getCol()); 
//设置单元格所在行
evaluator.setCurrentRow(row);
HSSFFormulaEvaluator.CellValue cellValue = evaluator.evaluate(cell);

switch (cellValue.getCellType()) {
case HSSFCell.CELL_TYPE_BOOLEAN:
    System.out.println(cellValue.getBooleanValue());
    break;
case HSSFCell.CELL_TYPE_NUMERIC:
    System.out.println(cellValue.getNumberValue());
    break;
case HSSFCell.CELL_TYPE_STRING:
    System.out.println(cellValue.getStringValue());
    break;
case HSSFCell.CELL_TYPE_BLANK:
    break;
case HSSFCell.CELL_TYPE_ERROR:
    break;

// CELL_TYPE_FORMULA will never happen
case HSSFCell.CELL_TYPE_FORMULA: 
    break;
}
分享到:
评论

相关推荐

    Apache POI库jar文件

    Apache POI库是一个开源的Java库,可以帮助开发人员处理Microsoft Office格式的文档,例如Word文档、Excel电子表格和PowerPoint演示文稿等。以下是Apache POI库的详细介绍: 支持多种Office格式:Apache POI库支持...

    Apache POI for Android

    Apache POI 是一个著名的开源项目,主要为处理微软的Office文档格式提供了一个强大的Java API。在Android开发中,Apache POI 提供了处理Excel文件的能力,使得开发者可以在Android设备上进行Excel的读写操作,无需...

    Apache POI资源包

    Apache POI是一个开源项目,由Apache软件基金会维护,专门用于处理Microsoft Office格式的文件,如Word(.doc/.docx)、Excel(.xls/.xlsx)、PowerPoint(.ppt/.pptx)等。这个资源包是Java开发者在跨平台上读取、...

    最新Apache POI 5.2.3jar包和源码

    Apache POI 是一个开源项目,由Apache软件基金会维护,它提供了API用于读写Microsoft Office格式的文件,如Excel、Word和PowerPoint。最新版本为5.2.3,这个压缩包包含了该版本的jar包和源码,对于开发者来说是进行...

    Apache POI 3.16 JAR 包

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。POI库提供了一套API,使得开发者能够在Java环境中读取、写入和修改这些文件。在本例中,我们关注的是"Apache POI ...

    Apache POI 所有 jar 下载

    Apache POI是Apache软件基金会提供的100%开源库。大多数中小规模的应用程序开发主要依赖于Apache POI(HSSF+ XSSF)。它支持Excel 库的所有基本功能; 然而,呈现和文本提取是它的主要特点。

    Apache poi 操作 excel 文件压缩包

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,包括Excel。在Java环境中,Apache POI 提供了一套API,使得开发者能够创建、修改和读取Excel文件。这个压缩包包含了Apache POI库的多个版本...

    apache POI文件读写excel

    Apache POI是Java领域中广泛使用的库,专为处理Microsoft Office格式的文件而设计,特别是Excel文档。这个库使得在不依赖Microsoft Office的情况下,开发者能够读取、创建、修改和操作XLS、XLSX等Excel文件。在本文...

    Apache POI API Document

    Apache POI 是一个开源项目,由Apache软件基金会维护,它主要提供了一套API,用于读取、写入和操作Microsoft Office格式的文件,包括Excel、Word、PowerPoint等。这个资源包含Apache POI API的两个不同版本——3.8和...

    利用Java Apache POI 生成Word文档示例代码

    "利用Java Apache POI 生成Word文档示例代码" 本篇文章主要介绍了利用Java Apache POI 生成Word文档示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。 首先,Apache POI是一个开源的Java库,由Apache...

    Apache poi 根据word模板生成word报表 替换 循环列表 图片

    Apache POI是一个强大的Java库,专门用于处理Microsoft Office格式的文件,如Word、Excel和PowerPoint。在本项目中,我们将关注如何使用Apache POI来根据预设的Word模板生成包含替换内容、循环列表和图片的动态Word...

    apache poi 导出excel、word

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如Excel和Word。它提供了Java API,使得开发者能够方便地在Java应用程序中创建、修改和读取这些文件。以下是对Apache POI的一些关键知识点的...

    Apache POI教程以及jar包

    Apache POI是一个开源项目,专为处理Microsoft Office格式的文件而设计,主要支持Microsoft的Excel、Word和PowerPoint文档。这个教程将引导你了解如何使用Apache POI库在Java环境中创建、修改和读取这些文件。 一、...

    apache poi读取word内容

    Apache POI是一个强大的Java库,专门用于处理Microsoft Office格式的文件,如Word、Excel和PowerPoint。在本案例中,我们将关注如何使用Apache POI来读取Word文档的内容,并将其以流的形式返回到Web应用程序的前端...

    apache POI.rar

    这个压缩包里有apache poi技术所使用的的jar包 包括:commons-beanutils-1.8.0.jar,commons-collections-3.2.jar,commons-io-2.2.jar,org.apache.servicemix.bundles.dom4j-2.1.1_1.jar,poi-3.9.jar,poi-ooxml-...

    Apache POI Excel操作

    Apache POI 是一个开源项目,专门用于读写Microsoft Office格式的文件,如Word(.doc/.docx)、Excel(.xls/.xlsx)和PowerPoint(.ppt/.pptx)。在Java开发环境中,Apache POI 提供了丰富的API,使得开发者能够方便...

    Apache POI 模板导出excel.rar

    Apache POI是一个强大的Java库,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。在"Apache POI 模板导出excel.rar"这个压缩包中,我们聚焦于使用Apache POI 3.16版本来生成基于Excel模板的...

    使用ITEXT导出PDF、WORD,APACHE POI导出EXCEL报表文件

    本文将深入探讨如何使用ITEXT库导出PDF和Word,以及利用Apache POI库导出Excel报表文件。 首先,让我们来了解ITEXT库。ITEXT是一个开源Java库,专门用于创建和修改PDF文档。使用ITEXT,你可以方便地生成包含文本、...

    apache poi

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。这个项目允许开发者在Java环境中创建、修改和读取这些文件,为跨平台的应用程序提供了强大的支持。Apache POI ...

    《apache poi4.0》【最新版poi,snapshot版本,新增多种操作office文件的功能】.docx

    ### Apache POI 4.0:新增多种操作Office文件的功能 #### 一、Apache POI 简介 Apache POI 是一个流行的 Java API,用于处理 Microsoft Office 格式的文件,包括但不限于 Word(`.doc`),Excel(`.xls`, `.xlsx`...

Global site tag (gtag.js) - Google Analytics