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

POI3.8组件研究(二)---基于User API (HSSF and XSSF)解析Excel2003和2007文件

 
阅读更多

                在解析生成excel2003和2007时候,由于生成的对象不同可能需要创建workbook的不同对象。

判断代码如下:

	/**
	 * 创建TableView类型的Excel文件
	 * @param excelVo excel模型
	 * @throws IOException
	 */
	public InputStream createTableViewerExcelStream(ExcelVO  excelVo) throws IOException{
		//创建一个EXCEL
		Workbook wb =null;
		//支持2007
		if("xlsx".equals(excelVo.getPrefix())){
			wb=new XSSFWorkbook();
		//支持97 ~2003
		}else{
			wb=new HSSFWorkbook();
		}
		List<SheetVO> sheetList=excelVo.getSheets();
		if(CollectionUtils.isNotEmpty(sheetList)){
			for (int sheet = 0; sheet < sheetList.size(); sheet++) {
				createExcelSheet(wb, sheetList, sheet);
			}
		}
		//存储流信息
	     ByteArrayOutputStream  out = new ByteArrayOutputStream();
	    wb.write(out);
	    
	    
	    //临时存储流信息
	    ByteArrayInputStream in  = new ByteArrayInputStream(out.toByteArray());
	    out.close();
	    return in;
	}

 

 

创建一个sheet的内容如下:

/**
	 * 创建Excel的Sheet
	 * @param wb  Excel的对象
	 * @param sheetList 
	 * @param sheetNum
	 */
	private void createExcelSheet(Workbook wb, List<SheetVO> sheetList, int sheetNum) {
		SheetVO sheetVo=sheetList.get(sheetNum);
		//获取各种样式
		//获取数据格式化对象
		DataFormat dataformat = wb.createDataFormat();
		//获取Sheet的名称
		String sheetName=sheetVo.getSheetName();
		//创建Sheet
		Sheet sheet=wb.createSheet(sheetName);
		   // create 2 cell styles
	    CellStyle cs = wb.createCellStyle();
	    CellStyle cs2 = wb.createCellStyle();
	    DataFormat df = wb.createDataFormat();

	    // create 2 fonts objects
	    Font f = wb.createFont();
	    Font f2 = wb.createFont();

	    // Set font 1 to 12 point type, blue and bold
	    f.setFontHeightInPoints((short) 12);
	    f.setColor( IndexedColors.RED.getIndex() );
	    f.setBoldweight(Font.BOLDWEIGHT_BOLD);

	    // Set font 2 to 10 point type, red and bold
	    f2.setFontHeightInPoints((short) 10);
	    f2.setColor( IndexedColors.RED.getIndex() );
	    f2.setBoldweight(Font.BOLDWEIGHT_BOLD);

	    // Set cell style and formatting
	    cs.setFont(f);
	    cs.setDataFormat(df.getFormat("#,##0.0"));

	    // Set the other cell style and formatting
	    cs2.setBorderBottom(cs2.BORDER_THIN);
	    cs2.setDataFormat(df.getFormat("text"));
	    cs2.setFont(f2);
	    
	    
		//获取开始写的行号
		int rowNum=sheetVo.getRowNum();
		//创建标题
		Row headerRow = sheet.createRow(0);
		headerRow.setHeightInPoints(40.0F);
		Cell titleCell = headerRow.createCell(0);
		titleCell.setCellValue(sheetVo.getTitle());
		sheet.addMergedRegion(CellRangeAddress.valueOf("$A$1:$T$1"));   
		
		CreationHelper createHelper = wb.getCreationHelper();
		String[] headerTitles=sheetVo.getHeaderTitle();
		if(!ArrayUtils.isEmpty(headerTitles)){
			//创建表头
			Row row = sheet.createRow((short)rowNum);
			for (int index=0; index < headerTitles.length; index++) {
				//创建列信息
				String headerTitle=headerTitles[index];
				Cell cell = row.createCell(index);
		    	cell.setCellValue(createHelper.createRichTextString(headerTitle));
		    	//设置列宽,行高
				sheet.setColumnWidth((short)index, 5000);
			}
			//行记录添加
			rowNum++;
		}
		//编写shett的内容
		List<Map<String,Object>> contentMap=sheetVo.getSheetContentMap();
		if(CollectionUtils.isNotEmpty(contentMap)){
			for (int index = 0; index < contentMap.size(); index++) {
				Map<String,Object> rowMap=contentMap.get(index);
				Row row = sheet.createRow((short)rowNum);
				createCell(wb, dataformat, rowMap, row,sheetVo);
				rowNum++;
			}
		}
	}

	/**
	 * 创建Excel的Cell
	 * @param wb
	 * @param dataformat
	 * @param rowMap
	 * @param row
	 */
	private void createCell(Workbook wb, DataFormat dataformat,
			Map<String, Object> rowMap, Row row,SheetVO sheetVo) {
		String[] headerTitles=sheetVo.getTitles();
		if(MapUtils.isNotEmpty(rowMap)){
			CreationHelper createHelper = wb.getCreationHelper();
			for (int cellNum=0;cellNum<headerTitles.length;cellNum++) {
				CellStyle style;
				//创建列值
				Cell cell = row.createCell(cellNum);
				String key=headerTitles[cellNum];
				Object cellValue=rowMap.get(key);
				
				if(cellValue instanceof String){
					cell.setCellValue(createHelper.createRichTextString((String)cellValue));
				}else if((cellValue instanceof Integer)||(cellValue instanceof Long)){
					cell.setCellValue(createHelper.createRichTextString(cellValue.toString()));
				//针对带小数点的数据的处理
				}else if((cellValue instanceof Double)||(cellValue instanceof Float)){
					    cell.setCellValue(Double.valueOf(cellValue.toString()));
					    style = wb.createCellStyle();
					    style.setDataFormat(dataformat.getFormat("#.##"));
					    //设定样式
					    cell.setCellStyle(style);
				//针对Date格式
				}else if(cellValue instanceof Date){
				    /*  
			         * 定义显示日期的公共格式  
			         * 如:yyyy-MM-dd hh:mm  
			         * */
				    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");   
			        String newdate = sdf.format(new Date()); 
			        // 填充出产日期   
				    cell.setCellValue(createHelper.createRichTextString(newdate));
				}else if(cellValue instanceof Boolean){
					cell.setCellValue((Boolean)cellValue);
				}
			}
		}
	}
	

 

针对excel中的时间格式需要自动转换为数字:

针对POI支持的事件格式如下一种:

org.apache.poi.ss.usermodel.DateUtil:

  private static final Pattern date_ptrn1 = Pattern.compile("^\\[\\$\\-.*?\\]");
  private static final Pattern date_ptrn2 = Pattern.compile("^\\[[a-zA-Z]+\\]");
  private static final Pattern date_ptrn3 = Pattern.compile("^[\\[\\]yYmMdDhHsS\\-/,. :\"\\\\]+0*[ampAMP/]*$");

  private static final Pattern date_ptrn4 = Pattern.compile("^\\[([hH]+|[mM]+|[sS]+)\\]");

 

将HH:MM和HH:MM:SS格式的转换数字的源代码如下:

org.apache.poi.ss.usermodel.DateUtil:

public static double convertTime(String timeStr)
  {
    try
    {
      return convertTimeInternal(timeStr);
    } catch (FormatException e) {
      String msg = "Bad time format '" + timeStr + "' expected 'HH:MM' or 'HH:MM:SS' - " + e.getMessage();

      throw new IllegalArgumentException(msg); }
  }

  private static double convertTimeInternal(String timeStr) throws DateUtil.FormatException {
    int len = timeStr.length();
    if ((len < 4) || (len > 8)) {
      throw new DateUtil.FormatException("Bad length");
    }
    String[] parts = TIME_SEPARATOR_PATTERN.split(timeStr);
    String secStr;
    switch (parts.length)
    {
    case 2:
      secStr = "00"; break;
    case 3:
      secStr = parts[2]; break;
    default:
      throw new DateUtil.FormatException("Expected 2 or 3 fields but got (" + parts.length + ")");
    }
    String hourStr = parts[0];
    String minStr = parts[1];
    int hours = parseInt(hourStr, "hour", 24);
    int minutes = parseInt(minStr, "minute", 60);
    int seconds = parseInt(secStr, "second", 60);

    double totalSeconds = seconds + (minutes + hours * 60) * 60;
    return (totalSeconds / 86400.0D);
  }

 针对YY-MM-dd时间格式的转换时间格式源代码:

public static Date parseYYYYMMDDDate(String dateStr)
  {
    try
    {
      return parseYYYYMMDDDateInternal(dateStr);
    } catch (FormatException e) {
      String msg = "Bad time format " + dateStr + " expected 'YYYY/MM/DD' - " + e.getMessage();

      throw new IllegalArgumentException(msg); }
  }

 

 

注意:在读取excel时候需要解读HH:MM或者HH:MM:SS或者YYYY/MM/DD的转换,必须确定时间的格式,才可以转换。

 

 

 

 

 

 针对2003和2007的excel中向单元格中写入内容是:

         可能有点不同,需要使用CreationHelper生成数据:

            Calling the empty HSSFWorkbook remains as the way to create a new, empty Workbook object. To open an existing Worbook, you should now call WorkbookFactory.create(inp).

For all other cases when you would have called a Usermodel constructor, such as 'new HSSFRichTextString()' or 'new HSSFDataFormat', you should instead use a CreationHelper. There's a method on the Workbook to get a CreationHelper, and the CreationHelper will then handle constructing new objects for you.

 

例如:

	Cell cell = row.createCell(index);
	cell.setCellValue(createHelper.createRichTextString(headerTitle));

 

分享到:
评论

相关推荐

    POI3.8组件研究(七)--基于XSSF and SAX (Event API)事件的解析

    "POI3.8组件研究(七)--基于XSSF and SAX (Event API)事件的解析" 提到了Apache POI库的一个高级话题,主要关注的是如何使用XSSF(XML Spreadsheet Formatting Streams)和SAX(Simple API for XML)的Event API来...

    poi-3.8-POI-HSSF和POI-XSSF和SXSSF.rar

    在"poi-3.8-POI-HSSF和POI-XSSF和SXSSF.rar"这个压缩包中,主要涵盖了POI项目对Excel文件处理的三个关键组件:HSSF、XSSF和SXSSF。 1. HSSF (Horrible Spreadsheet Format):这是POI项目早期开发的一个API,用于...

    poi-src-3.8-beta5-20111217.tar.gz

    标题中的"poi-src-3.8-beta5-20111217.tar.gz"表明这是一款名为Apache POI的开源项目源代码的压缩包,版本为3.8 Beta5,发布日期为2011年12月17日。Apache POI是一个Java库,主要用于读写Microsoft Office格式的文件...

    poi-ooxml-schemas-3.8,poi-3.8,poi-ooxml jar包合集

    标题中的"poi-ooxml-schemas-3.8,poi-3.8,poi-ooxml jar包合集"指的是Apache POI项目中用于处理Microsoft Office格式文件的Java库,特别是针对Excel(XLS和XLSX)文档的处理。Apache POI是一个流行的开源库,允许...

    poi-3.8-20120326.jar、poi-ooxml-3.8-20120326.jar

    内部包括poi-3.8-20120326.jar、poi-ooxml-3.8-20120326.jar、poi-ooxml-schemas-3.8-20120326.jar 测试可用版本,有些下载的不能用

    POI 3.8解析Excel2003、Excel2007

    - HSSF API是用于读写老式BIFF格式(Excel 97-2003)的,而XSSF API则处理基于OOXML标准的新式Excel文件。 - 两者都提供了类似的接口,使得在处理不同格式的Excel文件时,代码可以保持相对一致。 3. **解析Excel...

    poi-3.8-beta3-20110606工具包

    1. **Excel处理**:POI提供了HSSF(Horizontally Stored Format)和XSSF(XML Spreadsheet Format)两个API,分别用于处理旧版的.BIFF8格式(.xls)和较新的OOXML格式(.xlsx)。这些API支持创建工作簿、工作表、...

    poi3.8+poi-pdf+poi-core.rar

    - **poi-3.8-20120326.jar**:核心库,提供了对HSSF(用于旧版Excel .xls)和XSSF(用于新版Excel .xlsx)的支持。 - **poi-ooxml-schemas-3.8-20120326.jar**:包含了Office Open XML的XML模式,用于解析和创建...

    读写Excel2007 POI3.8

    标题“读写Excel2007 POI3.8”涉及的是使用Apache POI库的3.8版本处理Microsoft Excel 2007文件的方法。Apache POI是Java的一个开源项目,专门用于读取、创建和修改Microsoft Office格式的文件,特别是Excel文件。在...

    POI包最新版3.8-beta4-20110826

    总结,Apache POI 3.8-beta4是一个用于处理Microsoft Office文档的Java库,它提供了对Excel、Word和PowerPoint文件的强大支持。通过这个库,开发者可以在Java环境中方便地读取、写入和操作这些文件,广泛应用于数据...

    POI3.8组件研究(四)--Event API (HSSF Only)事件的解析

    在本文中,我们将深入探讨Apache POI 3.8版本中的Event API,特别是针对HSSF(Horizontally Sparse File Format)的事件解析。Apache POI是一个流行的Java库,它允许开发人员处理Microsoft Office格式的文件,如...

    poi3.8和3.10还有3.11的jar包,保证可用

    这个版本引入了对Excel 2007的XSSF工作簿的支持,以及对HSSF(Excel 97-2007)和HWPF(Word 97-2007)的改进。此外,它还增强了对PowerPoint (HSLF) 和 OLE2 Compound Document Format 的处理。 - 3.8版中,开发者...

    poi-3.8-20120326.jar 和 poi-excelant-3.8-20120326.jar

    1. **Excel文件处理**:Apache POI 提供了HSSF(Horrible Spreadsheet Format)API来处理旧版的Excel 97-2003格式(.xls),以及XSSF(XML Spreadsheet Format)API来处理Excel 2007及以后版本的.xlsx格式。...

    poi-bin-3.8-beta4-20110826

    1. **HSSF (Horrible Spreadsheet Format)**:这是用于读写Microsoft Excel 97-2003格式文件(.xls)的API。HSSF提供了低级别数据模型,可以直接操作单元格、公式、样式等,同时还提供了高级用户模型,使得操作Excel...

    poi-3.8.jar;poi-ooxml-3.8.jar;poi-ooxml-schemas-3.8.jar

    java中读取word文档需要引用apache的poi开源项目...为方便下载提供6个jar包,其中包含:poi-3.8.jar;poi-ooxml-3.8.jar;poi-ooxml-schemas-3.8.jar;poi-scratchpad-3.8.jar;xmlbeans-2.3.0.jar;dom4j-1.6.1.jar。

    Apache POI HSSF和XSSF读写EXCEL总结

    Apache POI HSSF和XSSF读写EXCEL总结

    poi-3.8相关&解析excel2003和2007版

    在这个 poi-3.8 相关的压缩包中,我们主要关注的是如何使用Apache POI来解析Excel 2003和2007版的文件。 在Excel 2003中,文件格式通常是.XLS,它基于BIFF(Binary Interchange File Format)结构。而Excel 2007及...

    poi-3.8-20120326-6个jar包

    poi-3.8-20120326-6个jar包: poi-3.8-20120326.jar poi-examples-3.8-20120326.jar poi-excelant-3.8-20120326.jar poi-ooxml-3.8-20120326.jar poi-ooxml-schemas-3.8-20120326.jar poi-scratchpad-3.8-20120326....

    poi 3.8 版本全量包

    1. **poi-3.8-20120326.jar**:这是Apache POI的主要库,提供了对Excel(HSSF和XSSF)、Word(HWPF和XWPF)和PowerPoint(HSLF和XSLF)的基本支持。 2. **poi-scratchpad-3.8-20120326.jar**:此库包含了POI项目中...

    poi 3.8 3.9 3.10 3.15 3.17各种版本

    在Java环境中,POI库提供了丰富的API,使得开发者能够方便地读取、写入和操作这些文件。在给定的标题和描述中,提到了几个不同版本的POI,包括3.8、3.9、3.10、3.15和3.17。每个版本都有其特定的更新和改进,下面将...

Global site tag (gtag.js) - Google Analytics