`
micc010
  • 浏览: 71579 次
  • 性别: 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资源包

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

    Apache POI for Android

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

    最新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 导出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模板生成word报表 替换 循环列表 图片

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

    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