上都海奶茶馆 发表于 2017-1-7 09:56:19

Apache POI HSSF的简单使用

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;
}
页: [1]
查看完整版本: Apache POI HSSF的简单使用