今天了解一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();
}
}
}
分享到:
相关推荐
看到现在网上excel转pdf的代码很少,在csdn上找到一个还不能用,只能做简单的转换,只好自己写了一个,代码是一个maven工程,用eclipse创建,支持单元格合并等复杂的excel,同时能同步单元格样式到pdf中。...
Java POI库是Apache软件基金会开发的一个开源项目,专门用于处理Microsoft Office格式的文件,包括Excel。本资源包集合了使用Java进行Excel读取、写入等操作所需的全部jar文件,且这些jar文件已更新至最新版本,支持...
本文将详细讲解如何使用 Java 语言实现从 Excel 文件到 XML 文件的转换,并提供一份基于给定代码片段的详细分析与补充。 #### 核心知识点 1. **Java API 使用** - `org.apache.poi`: 这是用于读取和写入 ...
在本项目中,我们结合了POI库和XML技术来实现Excel数据的验证与导入数据库。 首先,Apache POI提供了HSSF和XSSF两个API,分别用于处理老版本的BIFF8格式(.xls)和新版本的OOXML格式(.xlsx)。在这个案例中,我们...
标题中的“`java+poi+Excel模板`”指的是使用Java编程语言,结合Apache POI库来处理Microsoft Excel模板,以生成或编辑Excel报表的过程。Apache POI是一个流行的开源项目,它允许开发者使用Java读写Microsoft Office...
在IT领域,XML和Excel...开发者可以借此学习和理解XML的解析、Java对象与Excel单元格之间的映射,以及如何使用Apache POI实现复杂的Excel操作。这不仅可以提高数据处理的效率,还能减少格式转换过程中可能出现的错误。
标题和描述提到的"java+poi+excel读取写入等操作所有jar(最新支持excel2013)"指的是使用Java POI库进行Excel文件的各种操作,并且这些操作适用于Excel 2013版本,这表明提供的jar文件应该包含了支持较新Excel格式...
Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 Excel 文件。在本文中,我们将详细介绍如何使用 Java POI 实现 Excel 导入导出功能。 1. 什么是 Java ...
在本项目中,"SpringBootMybatis+poi+Thymeleaf实现excel文件数据导入到数据库以及从数据库将数据导出成excel.zip",我们主要关注的是如何利用Java技术栈来处理Excel文件,并与数据库进行交互。以下是相关知识点的...
Java的Apache POI库是一个强大的工具,用于读取、创建和修改Microsoft Office格式的文件,尤其是Excel(.xlsx)文档。在本示例中,我们将深入探讨如何利用POI库来生成Excel中的图表曲线,这对于数据可视化和报告生成...
Java通过Apache POI库操作Excel是Java开发人员处理Microsoft Office文档的一种常见方法,特别是当需要在应用程序中生成、读取或修改Excel数据时。Apache POI是一个开源项目,提供了丰富的API,使得Java开发者能够...
总的来说,"基于POI+XML配置模板Excel导出"是一种高效的Excel导出策略,它利用了POI的强大功能和XML模板的灵活性,使得在Java应用中生成格式化的Excel文件变得更加便捷。对于需要处理大量数据报表的项目,这样的解决...
《使用Java+POI+模板技术生成复杂Excel报表》 在信息技术领域,数据的展示和分析是至关重要的,Excel作为一款强大的电子表格工具,被广泛应用于数据的整理和报表制作。然而,当需要自动化生成复杂的Excel报表时,...
《“java+poi+模板”打造复杂excel报表》 在Java开发中,生成复杂的Excel报表是一项常见的需求,尤其在数据分析、报表生成等领域。Apache POI库是Java中处理Microsoft Office格式文件的重要工具,它提供了对Excel...
在这个场景中,我们看到一个关于如何使用Java编程语言实现此功能的资源包:“利用poi+itextpdf进行word转pdf.rar”。这个压缩包包含源码、依赖库以及转换效果的示例,表明它提供了一种无需额外插件的解决方案。下面...
在Java中,使用POI库可以实现对Excel文件的读取、写入以及修改等操作,这对于数据分析、报表生成、自动化测试等场景非常实用。在你提到的资源中,"javaYdmxx80.zip"很可能包含了进行这些操作所需的jar文件,这些文件...
为了实现Excel与XML之间的相互转换,本文提出了一种基于Java的解决方案。该方案利用了Java平台的优势,确保了转换过程的跨平台性,并且可以有效地在网络环境中进行数据传输。 - **转换原理**:首先,使用纯Java实现...
"xmlbeans-2.6.0.jar"是XMLBeans的二进制库,XMLBeans是一个Java库,它将XML文档转换为Java对象,并允许直接操作这些对象,反之亦然。XMLBeans提供了基于Java反射的API,使得开发者可以以面向对象的方式处理XML。在...
JAVA POI Excel转Html,代码和所需的jar都在压缩包,项目在线预览需求,实现后分享下