`
lthu
  • 浏览: 59070 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Apache POI HSSF的简单使用

阅读更多
java 代码
  1. 1.生成(Excel)Workbook对象   
  2.     创建HSSFWorkbook对象   
  3.     创建 HSSFSheet 对象   
  4.     创建HSSFRow对象   
  5.     创建HSSFCell对象   
  6.   
  7. 2.将Workbook对象写入文件   
  8.   
  9.     FileOutputStream fout = new FileOutputStream("t" + "sfname");  //文件名   
  10.     ewb.write(fout);              
  11.     fout.close();    
  12.   
  13.   
  14.   
  15. //create new excel file and return the file's name   
  16.     public String getMyExcel(String strsql) {   
  17.         String sfname = "";   
  18.         sfname = this.getUniqueFilename();   
  19.   
  20.         if (null == sfname || sfname.trim().equals("")) {   
  21.             return ""//error:getUniqueFilename failed.   
  22.         }   
  23.   
  24.         //strsql = "select aac001,aac002,aac003,aac004,aae036 from ac01 where datediff(yy,aae036,getdate()) = 0 ";    
  25.         if (null == strsql || strsql.trim().equals("")) {   
  26.             return ""//   
  27.         }   
  28.   
  29.         Connection conn = null;   
  30.         PreparedStatement pst = null;   
  31.         ResultSet rs = null;   
  32.   
  33.         try {   
  34.             conn = getConnection();   
  35.             pst = conn.prepareStatement(strsql);   
  36.             rs = pst.executeQuery();   
  37.   
  38.             if (null == rs) {   
  39.                 return ""//error.   
  40.             }   
  41.   
  42.             boolean bHave = rs.next();   
  43.             if (!bHave) {   
  44.                 return ""//no record.   
  45.             }   
  46.   
  47.             HSSFWorkbook ewb = new HSSFWorkbook();   
  48.             HSSFSheet esh = ewb.createSheet("list01");   
  49.             HSSFRow erow = null;   
  50.             HSSFCell ecell = null;   
  51.   
  52.             //HSSFFont   
  53.             HSSFFont numFont = ewb.createFont();   
  54.             //font.setFontHeightInPoints((short)24);   
  55.             numFont.setFontName("Courier New");   
  56.   
  57.             //song   
  58.             HSSFFont font = ewb.createFont();   
  59.             font.setFontHeightInPoints( (short12);   
  60.             font.setFontName("宋体");   
  61.             //font.setItalic(true);   
  62.   
  63.             // Fonts are set into a style so create a new one to use.   
  64.             HSSFCellStyle style = ewb.createCellStyle();   
  65.             style.setFont(font);   
  66.   
  67.             //HSSFCellStyle   
  68.             HSSFCellStyle cellNumStyle = ewb.createCellStyle();   
  69.             cellNumStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);   
  70.             cellNumStyle.setFont(font);   
  71.             cellNumStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0"));   
  72.            //HSSFDataFormat df = wb.createDataFormat();   
  73.           //style.setDataFormat(df.getFormat("#,##0.00"));   
  74.   
  75.             HSSFCellStyle cellTxtStyle = ewb.createCellStyle();   
  76.             cellTxtStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT);   
  77.             cellTxtStyle.setFont(font);   
  78.             cellTxtStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("text"));   
  79.   
  80.             HSSFCellStyle cellDateStyle = ewb.createCellStyle();   
  81.             cellDateStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT);   
  82.             cellDateStyle.setFont(font);   
  83.             cellDateStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat(   
  84.                 "m/d/yy h:mm"));   
  85.   
  86.             int currow = 0//当前行   
  87.   
  88.             //生成列标题   
  89.             int colNum = 0//列   
  90.             ResultSetMetaData rsmd = rs.getMetaData();   
  91.             colNum = rsmd.getColumnCount();   
  92.   
  93.             erow = esh.createRow(currow++); //标题行   
  94.             for (short j = 0; j < colNum; j++) {   
  95.                 ecell = erow.createCell(j);   
  96.                 ecell.setEncoding(HSSFCell.ENCODING_UTF_16);   
  97.                 ecell.setCellValue(rsmd.getColumnName(j + 1));   
  98.                 ecell.setCellStyle(cellTxtStyle);   
  99.   
  100.             }   
  101.   
  102.             //详细列表   
  103.             while (bHave) { //get row.   
  104.   
  105.                 //create row.   
  106.                 erow = esh.createRow(currow);   
  107.   
  108.                 for (short i = 0; i < colNum; i++) {   
  109.                     int dataType = rsmd.getColumnType(i + 1);   
  110.   
  111.                     //create cell.   
  112.                     ecell = erow.createCell(i);   
  113.                     ecell.setEncoding(HSSFCell.ENCODING_UTF_16);   
  114.   
  115.                     switch (dataType) {   
  116.                         case Types.NUMERIC:   
  117.                             ecell.setCellValue(rs.getDouble(i + 1));   
  118.                             ecell.setCellStyle(cellNumStyle);   
  119.                             break;   
  120.                         case Types.CHAR:   
  121.                         case Types.LONGVARCHAR:   
  122.                         case Types.VARCHAR:   
  123.                             ecell.setCellValue(rs.getString(i + 1));   
  124.                             ecell.setCellStyle(cellTxtStyle);   
  125.                             break;   
  126.                         case Types.DATE:   
  127.                             ecell.setCellValue(rs.getDate(i + 1));   
  128.                             ecell.setCellStyle(cellDateStyle);   
  129.                             break;   
  130.                         case Types.TIME:   
  131.                             ecell.setCellValue(rs.getTime(i + 1));   
  132.                             ecell.setCellStyle(cellDateStyle);   
  133.                             break;   
  134.                         case Types.TIMESTAMP:   
  135.                             ecell.setCellValue(rs.getTimestamp(i + 1));   
  136.                             ecell.setCellStyle(cellDateStyle);   
  137.                             break;   
  138.                         default:   
  139.                             ecell.setCellValue(rs.getString(i + 1));   
  140.                             ecell.setCellStyle(cellTxtStyle);   
  141.   
  142.                     }   
  143.                 }   
  144.   
  145.                 bHave = rs.next();   
  146.                 currow++;   
  147.             }   
  148.   
  149.             FileOutputStream fout = new FileOutputStream("t" + "sfname");              
  150.             ewb.write(fout);              
  151.             fout.close();             
  152.         }   
  153.         catch (Exception sqle) {   
  154.             //   
  155.             sqle.printStackTrace();   
  156.             return "";   
  157.         }   
  158.         finally {   
  159.             try {   
  160.                 if (null != rs) {   
  161.                     rs.close();   
  162.                     rs = null;   
  163.                 }   
  164.   
  165.                 if (null != pst) {   
  166.                     pst.close();   
  167.                     pst = null;   
  168.                 }   
  169.                 if (null != conn) {   
  170.                     conn.close();   
  171.                     conn = null;   
  172.                 }   
  173.   
  174.             }   
  175.             catch (Exception exx) {   
  176.                 //   
  177.             }   
  178.         }   
  179.   
  180.         return sfname;   
  181.     }   
  182.  
  183.  
  184. 设置单元格样式 

    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("部门");

  185. 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;
    }

分享到:
评论
3 楼 1174511820 2011-02-11  
总结的很好啊,谢了
2 楼 shunai 2010-11-29  
读公式的时候就模糊跳过了!
1 楼 Joo 2008-05-31  
这个应该就是官方user Guide的一个中文翻译版本

相关推荐

    Apache POI HSSF和XSSF读写EXCEL总结

    Apache POI HSSF和XSSF读写EXCEL总结

    Apache POI HSSF读写Excel

    以下是对使用Apache POI HSSF进行Excel读写操作的详细知识点: 1. **HSSF模型**:Apache POI使用了一种类似于Excel内部结构的模型来表示工作簿、工作表、行、单元格等元素。HSSFWorkbook代表一个工作簿,HSSFSheet...

    org.apache.poi jar包

    import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFPalette; ...

    org.apache.poi JAR包

    import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFPalette; ...

    Apache POI HSSF and XSSF 快速指南帮助文档 API poi-3.15

    ### Apache POI HSSF and XSSF 快速指南帮助文档 API poi-3.15 #### 一、Apache POI 概述 Apache POI 是一个用于读取和写入 Microsoft Office 格式文件(如 Word 和 Excel)的开源 Java 库。它支持多种格式,包括...

    org.apache.poi.hssf.converter,office转html所需包

    `org.apache.poi.hssf.converter` 是Apache POI的一个子模块,它专注于处理老版本的Excel文件(.xls),也就是基于HSSF(Horizontally Stored Spreadsheet Format)的文件。 在这个标题为“org.apache.poi.hssf....

    org.apache.poi.hssf.record.RecordInputStream$LeftoverDataException

    解决POI读取EXCEL时报org.apache.poi.hssf.record.RecordInputStream$LeftoverDataException异常

    Apache POI库jar文件

    开发人员可以使用Apache POI库来读取、写入和修改这些格式的文档。 提供多种API:Apache POI库提供了多种API,包括HSSF、XSSF、HWPF、XWPF、HSLF和XSLF等。这些API可以帮助开发人员处理不同类型的Office文档,例如...

    org.apache.poi.hssf.usermodel.HSSFCell

    velocity开发插件org.apache.poi.hssf.usermodel.HSSFCellorg.apache.poi.hssf.usermodel.HSSFCell

    Apache POI资源包

    1. **读取Microsoft Office文件**:通过HSSF(Horrible Spreadsheet Format)和XSSF(XML Spreadsheet Format)API,Apache POI能够读取旧版的Excel文件(.xls)和新版本的Excel文件(.xlsx)。类似地,HWPF...

    Apache POI for Android

    POI 使用了一种叫做HSSF(Horizontally Stored Spreadsheet Format)的API来处理老版本的Excel(.xls)文件,而XSSF则是用于处理新的XML格式的Excel(.xlsx)文件。 2. **Apache POI for Android** 尽管Apache POI...

    POI HSSF - Excel实例

    结合描述中的博客链接,这个压缩包可能是一个学习资源,其中的代码实例详细展示了如何使用Apache POI的HSSF API进行Excel文件的操作。开发者可以通过阅读和运行这些代码来了解和实践如何在实际项目中使用POI HSSF。 ...

    Apache POI 所有 jar 下载

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

    最新Apache POI 5.2.3jar包和源码

    2. **poi-5.2.3.jar**: 这是Apache POI的核心库,包含了处理HSSF(Excel的低级API,用于老版本的.xls文件)和XSSF(Excel的高级API,用于.xlsx文件)所需的所有类和方法。 3. **poi-ooxml-5.2.3.jar**: 这个库用于...

    org.apache.poi JAR包 Java

    org.apache.poi JAR包,解决import org.apache.poi.hssf.usermodel.HSSFWorkbook; 支持office全系excel文件解析。 import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; ...

    org.apache.poi依赖包

    1. **Excel处理**:Apache POI 提供了HSSF(Horrible Spreadsheet Format)和XSSF(XML Spreadsheet Format)两个API,分别用于处理旧版的.xls格式和较新的.xlsx格式。它们支持创建工作簿、工作表、行、单元格等,并...

    apache-poi-3.17(最新稳定版本)

    Apache POI 提供了Java API,使得开发者可以使用Java来读取、写入和修改这些文件。在给定的"apache-poi-3.17(最新稳定版本)"中,我们聚焦于3.17这个稳定版,它是截止到提及时的最新版本。 Apache POI 3.17版本是...

    Apache POI 3.16 JAR 包

    **使用Apache POI进行Excel操作** 1. **创建工作簿**: 使用`WorkbookFactory.create()`方法可以创建一个新的工作簿对象。 2. **添加工作表**: 调用`Workbook`的`createSheet()`方法可以创建新工作表,并返回一个`...

    poi-3.9 apache-poi-3.9 最新稳定版本

    在"poi-3.9.jar"这个文件中,包含了Apache POI项目的主要类和接口,用于处理HSSF(Horizontally Stored Formatted Sheets)和XSSF(XML Spreadsheet Format)文件,分别对应老版的.BIFF8 Excel格式和OOXML的新版....

    apache POI文件读写excel

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

Global site tag (gtag.js) - Google Analytics