`
wangdongsong
  • 浏览: 36030 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

POI+XOM+Java操作Excel与XML之间转换

阅读更多

今天了解一POI和XOM,在Excel和XMl文件之间互换,做了一个例子,但没有重构,重构以后再做,请各位高手讲讲,怎么样重构是最优的。

/**
 * 
 * ExcelXML.java
 * IBM_Developer_POI(Excel,Word)
 * 2010-6-3 上午08:14:59
 */
package com.wds.excelxml;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.NumberFormat;
import java.text.ParseException;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFDataFormatter;
import org.apache.poi.hssf.usermodel.HSSFHyperlink;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import nu.xom.Attribute;
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.Elements;
import nu.xom.Serializer;


/** 
 * 2010-6-3 上午08:14:59
 */
public class ExcelXML {

	/**
	 * 2010-6-3 上午08:14:59
	 * @param args
	 */
	public static void main(String[] args) {
		excelXML();
	}
	
	/**
	 * 从Excel到XML
	 * 从XML到Excel
	 * 2010-6-3 下午07:30:44
	 */
	private static void excelXML(){
		/*
		 * 首先创建一个XML文档
		 * 要创建XML文档,首先创建一个根元素
		 */
		Element reportRoot=new Element("sheet");
		Document xmlReport=new Document(reportRoot);
		
		try {
			//读取Excel文件
			FileInputStream excelFIS=new FileInputStream("D:\\JavaTest\\Employee_List.xls");
			//创建Excel工作表
			HSSFWorkbook excelWB=new HSSFWorkbook(excelFIS);
			//获得Excel工作簿
			HSSFSheet excelSheet=excelWB.getSheetAt(0);
			//获得工作簿的行数
			int rows=excelSheet.getPhysicalNumberOfRows();			
			//遍历工作簿的行
			for(int rowIndex=0; rowIndex<rows;rowIndex++){
				HSSFRow oneRow=excelSheet.getRow(rowIndex);
				if(oneRow==null){
					continue;
				}
				//在迭代每一行的时候,创建xml的行元素
				Element rowElement=new Element("row");
				//获得当前行的单元格数
				int cells=oneRow.getPhysicalNumberOfCells();
				//遍历行中的每一个单元格
				for(int cellIndex=0;cellIndex<cells;cellIndex++){
					HSSFCell oneCell=oneRow.getCell(cellIndex);
					if(oneCell==null){
						continue;
					}
					//设置元素的默认名称 
					String elementName="header";
					//获得单元格所在列位置
					int cellColumnIndex=oneCell.getColumnIndex();
					if(rowIndex>0){
						elementName=reportRoot.getFirstChildElement("row").getChild(cellColumnIndex).getValue();
					}
					/*
					 * 去掉非法字符
					 */
					elementName = elementName.replaceAll("[\\P{ASCII}]","");
					elementName = elementName.replaceAll(" ", "");
					
					Element cellElement = new Element(elementName);
					//添加属性和元素
					//String attributeValue=oneCell.getCellStyle().getDataFormatString();
					//Attribute dataFormatAttribute=new Attribute("dataFormat", attributeValue);
					//cellElement.addAttribute(dataFormatAttribute);
					
					/*
					 * 根据不同的属性添加
					 */
					Attribute strTypeAttribute=null;
					switch (oneCell.getCellType()) {
					case HSSFCell.CELL_TYPE_STRING:
						strTypeAttribute=new Attribute("dataType","String");
						cellElement.addAttribute(strTypeAttribute);
						cellElement.appendChild(oneCell.getStringCellValue());
						rowElement.appendChild(cellElement);
						break;
					case HSSFCell.CELL_TYPE_NUMERIC:
						strTypeAttribute=new Attribute("dataType","Numeric");
						cellElement.addAttribute(strTypeAttribute);
						HSSFDataFormatter dataFormatter=new HSSFDataFormatter();
						String cellFormatted=dataFormatter.formatCellValue(oneCell);
						cellElement.appendChild(cellFormatted);
						rowElement.appendChild(cellElement);
						break;
					}
				}
				if(rowElement.getChildCount()>0){
					reportRoot.appendChild(rowElement);
				}
				//System.out.println(xmlReport.toXML());
			}

			
			/*
			 * 计算薪水的 1% 并存储到一个 donation 元素中
			 */
			Elements rowElements=reportRoot.getChildElements("row");
			//遍历每一个行元素
			for(int i=0;i<rowElements.size();i++){
				/*
				 * 第一行元素是头,不计算
				 * 计算薪水的1%存储到donation的节点上
				 */
				if(i==0){
					Element donationElement=new Element("header");
					donationElement.appendChild("Donation");
					
					Attribute dataType=new Attribute("dataType", "String");
					donationElement.addAttribute(dataType);
					
					Attribute dataFormat=new Attribute("dataFormat", "General");
					donationElement.addAttribute(dataFormat);
					
					rowElements.get(i).appendChild(donationElement);
				}else{
					Element donationElement=new Element("donation");
					//添加数据类型的属性
					Attribute dataType=new Attribute("dataType","Numeric");
					donationElement.addAttribute(dataType);
					//添加数据格式的属性
					Attribute dataFormat=new Attribute("dataFormat", "#,##0");
					donationElement.addAttribute(dataFormat);
					
					//获得当前行的薪水
					Element salaryElement=rowElements.get(i).getFirstChildElement("Salary");
					String salaryString=salaryElement.getValue();
					//转换薪水格式
					NumberFormat numberFormat=NumberFormat.getInstance();
					Number salaryNumber=numberFormat.parse(salaryString);
					//计算薪水的1%
					double donationSalary=salaryNumber.doubleValue()*0.01;
					//添加薪水节点
					donationElement.appendChild(Double.toString(donationSalary));
					rowElements.get(i).appendChild(donationElement);
				}//End else
			}//End for(int i=0;i<rowElements.size();i++)
			
			//屏幕输出XML文件
			System.out.println(xmlReport.toXML());
			
			/*
			 * 输出到文件
			 */
			FileOutputStream xmlFOS=new FileOutputStream("D:\\JavaTest\\Employee_List.xml");
			//创建Serializer,输出文件
			Serializer saveXMLSerializer=new Serializer(xmlFOS);
			//saveXMLSerializer.setIndent(5);
			saveXMLSerializer.write(xmlReport);
			
			/*
			 * 将XML写回Excel
			 */
			//创建工作表
			HSSFWorkbook donationWorkbook=new HSSFWorkbook();
			HSSFSheet donationSheet=donationWorkbook.createSheet();
			//迭代行元素 outer loop
			for(int i=0;i<rowElements.size();i++){
				HSSFRow donationRow=donationSheet.createRow(i);
				Elements cellElements=rowElements.get(i).getChildElements();
				//inner loop
				for(int j=0;j<cellElements.size();j++){
					HSSFCell createdCell=donationRow.createCell(j);
					//获得数据类型的属性值
					String dataFormatString=cellElements.get(j).getAttributeValue("dataType");
					//设置数据格式
					HSSFCellStyle currentStyle=donationWorkbook.createCellStyle();
					HSSFDataFormat currentDataFormat=donationWorkbook.createDataFormat();
					short dataFormatIndex=currentDataFormat.getFormat(dataFormatString);
					currentStyle.setDataFormat(dataFormatIndex);
					createdCell.setCellStyle(currentStyle);
					//根据数据类型写入数据
					//如果数据类型是String
					if(cellElements.get(j).getAttribute("dataType").toString().equals("String")){
						createdCell.setCellType(HSSFCell.CELL_TYPE_STRING);
						createdCell.setCellValue(cellElements.get(j).getValue());
					}
					//数据类型是Numeric
					if(cellElements.get(j).getAttribute("dataType").toString().equals("Numeric")){
						createdCell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
						
						//判断数据格式
						if(cellElements.get(j).getAttribute("dataFormat").toString().contains("#")){
							//转换格式
							NumberFormat numberFormat=NumberFormat.getInstance();
							Number cellValueNumber=numberFormat.parse(cellElements.get(j).getValue());
							createdCell.setCellValue(cellValueNumber.doubleValue());
							HSSFHyperlink hyperlink=new HSSFHyperlink(HSSFHyperlink.LINK_URL);
							hyperlink.setAddress("Http://www.hbut.edu.cn");
							createdCell.setHyperlink(hyperlink);
						}
					}else{
						createdCell.setCellValue(cellElements.get(j).getValue());
					}//End if
				}//End inner loop
			}//End outer loop
			
			FileOutputStream excelFOS=new FileOutputStream("D:\\JavaTest\\Employee_Donation.et");
			donationWorkbook.write(excelFOS);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}

}
 
分享到:
评论
4 楼 贝塔ZQ 2016-09-02  
操作excel文档的话,试试插件么,很简单,PageOffice就不错
3 楼 梦中有你 2011-01-06  
用xml来生成Excel 为什么没人用往xml里添加标签去做呢?动态构造一个xml然后修改后缀为xls不就出来了?
2 楼 wangdgsc 2010-06-04  
看这样的代码真的是要命
1 楼 joeyhacker 2010-06-04  
Excel与XML之间转换有什么意义?  前几天我通过用DOM4J写成Excel. 效率还没JXL高, 6W数据80多M好像

相关推荐

    使用poi+itext将excel转为pdf

    看到现在网上excel转pdf的代码很少,在csdn上找到一个还不能用,只能做简单的转换,只好自己写了一个,代码是一个maven工程,用eclipse创建,支持单元格合并等复杂的excel,同时能同步单元格样式到pdf中。...

    java+poi+excel读取写入等操作所有jar(最新支持excel2013)Java实用源码整理learns

    Java POI库是Apache软件基金会开发的一个开源项目,专门用于处理Microsoft Office格式的文件,包括Excel。本资源包集合了使用Java进行Excel读取、写入等操作所需的全部jar文件,且这些jar文件已更新至最新版本,支持...

    java Excel转化xml

    本文将详细讲解如何使用 Java 语言实现从 Excel 文件到 XML 文件的转换,并提供一份基于给定代码片段的详细分析与补充。 #### 核心知识点 1. **Java API 使用** - `org.apache.poi`: 这是用于读取和写入 ...

    Java 使用poi导入excel 并使用xml做数据验证

    在本项目中,我们结合了POI库和XML技术来实现Excel数据的验证与导入数据库。 首先,Apache POI提供了HSSF和XSSF两个API,分别用于处理老版本的BIFF8格式(.xls)和新版本的OOXML格式(.xlsx)。在这个案例中,我们...

    \"java+poi+Excel模板\"制作简单的报表

    标题中的“`java+poi+Excel模板`”指的是使用Java编程语言,结合Apache POI库来处理Microsoft Excel模板,以生成或编辑Excel报表的过程。Apache POI是一个流行的开源项目,它允许开发者使用Java读写Microsoft Office...

    基于DOM4j和POI实现的XML文件转换为XLS(即标准EXCEL)的JAVA程序

    在IT领域,XML和Excel...开发者可以借此学习和理解XML的解析、Java对象与Excel单元格之间的映射,以及如何使用Apache POI实现复杂的Excel操作。这不仅可以提高数据处理的效率,还能减少格式转换过程中可能出现的错误。

    java+poi+excel读取写入等操作所有jar(最新支持excel2013javalearnsa资料分享

    标题和描述提到的"java+poi+excel读取写入等操作所有jar(最新支持excel2013)"指的是使用Java POI库进行Excel文件的各种操作,并且这些操作适用于Excel 2013版本,这表明提供的jar文件应该包含了支持较新Excel格式...

    java_poi实现excel导入导出

    Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 Excel 文件。在本文中,我们将详细介绍如何使用 Java POI 实现 Excel 导入导出功能。 1. 什么是 Java ...

    SpringBootMybatis+poi+Thymeleaf实现excel文件数据导入到数据库以及从数据库将数据导出成excel.zip

    在本项目中,"SpringBootMybatis+poi+Thymeleaf实现excel文件数据导入到数据库以及从数据库将数据导出成excel.zip",我们主要关注的是如何利用Java技术栈来处理Excel文件,并与数据库进行交互。以下是相关知识点的...

    java的poi生成excel图表demo

    Java的Apache POI库是一个强大的工具,用于读取、创建和修改Microsoft Office格式的文件,尤其是Excel(.xlsx)文档。在本示例中,我们将深入探讨如何利用POI库来生成Excel中的图表曲线,这对于数据可视化和报告生成...

    java 通过poi操作excel jar包

    Java通过Apache POI库操作Excel是Java开发人员处理Microsoft Office文档的一种常见方法,特别是当需要在应用程序中生成、读取或修改Excel数据时。Apache POI是一个开源项目,提供了丰富的API,使得Java开发者能够...

    基于POI+XML配置模板Excel导出

    总的来说,"基于POI+XML配置模板Excel导出"是一种高效的Excel导出策略,它利用了POI的强大功能和XML模板的灵活性,使得在Java应用中生成格式化的Excel文件变得更加便捷。对于需要处理大量数据报表的项目,这样的解决...

    “java+poi+模板”打造复杂excel报表.docx

    《使用Java+POI+模板技术生成复杂Excel报表》 在信息技术领域,数据的展示和分析是至关重要的,Excel作为一款强大的电子表格工具,被广泛应用于数据的整理和报表制作。然而,当需要自动化生成复杂的Excel报表时,...

    “java+poi+模板”打造复杂excel报表.pdf

    《“java+poi+模板”打造复杂excel报表》 在Java开发中,生成复杂的Excel报表是一项常见的需求,尤其在数据分析、报表生成等领域。Apache POI库是Java中处理Microsoft Office格式文件的重要工具,它提供了对Excel...

    利用poi+itextpdf进行word转pdf.rar

    在这个场景中,我们看到一个关于如何使用Java编程语言实现此功能的资源包:“利用poi+itextpdf进行word转pdf.rar”。这个压缩包包含源码、依赖库以及转换效果的示例,表明它提供了一种无需额外插件的解决方案。下面...

    java+poi+excel读取写入等操作所有jar(最新支持excel2013)+poi-bin-3.10-beta2-20130904源代码学习

    在Java中,使用POI库可以实现对Excel文件的读取、写入以及修改等操作,这对于数据分析、报表生成、自动化测试等场景非常实用。在你提到的资源中,"javaYdmxx80.zip"很可能包含了进行这些操作所需的jar文件,这些文件...

    Excel与XML相互转化的Java实现

    为了实现Excel与XML之间的相互转换,本文提出了一种基于Java的解决方案。该方案利用了Java平台的优势,确保了转换过程的跨平台性,并且可以有效地在网络环境中进行数据传输。 - **转换原理**:首先,使用纯Java实现...

    Spring MVC+Spring+Mybatis+poi+xml全部jar包

    "xmlbeans-2.6.0.jar"是XMLBeans的二进制库,XMLBeans是一个Java库,它将XML文档转换为Java对象,并允许直接操作这些对象,反之亦然。XMLBeans提供了基于Java反射的API,使得开发者可以以面向对象的方式处理XML。在...

    JAVA POI Excel转Html

    JAVA POI Excel转Html,代码和所需的jar都在压缩包,项目在线预览需求,实现后分享下

Global site tag (gtag.js) - Google Analytics