Java使用Spire.XLS for Java实现Excel与XML互转

 更新时间:2026年02月03日 08:23:20   作者:用户033212666367  
在当今的数据驱动时代,不同系统间的数据交换与集成已成为常态,本文将深入探讨如何利用强大的Spire.XLS for Java库,在Java环境中轻松实现Excel到XML以及XML到Excel的灵活转换,希望对大家有所帮助

在当今的数据驱动时代,不同系统间的数据交换与集成已成为常态。Excel作为常见的报表和数据存储格式,XML作为一种跨平台的数据交换标准,它们之间的相互转换是Java开发者经常面临的实际需求。无论是将Excel数据导出为XML进行API调用,还是将接收到的XML数据导入Excel进行可视化分析,都需要一套高效可靠的解决方案。本文将深入探讨如何利用强大的Spire.XLS for Java库,在Java环境中轻松实现Excel到XML以及XML到Excel的灵活转换,帮助你提升数据处理效率。

Spire.XLS for Java 库简介与安装

Spire.XLS for Java是一个功能丰富的Excel操作库,它允许开发者在Java应用程序中创建、读取、编辑、转换和打印Excel文件,无需依赖Microsoft Office。其特点是API直观、性能高效,并且支持多种Excel文件格式(如XLS、XLSX、CSV等)与XML、PDF、HTML等格式的转换。

要开始使用Spire.XLS for Java,你需要在项目构建文件中添加相应的依赖。

Maven 依赖:

将下列代码添加到 pom.xml 文件中,以导入 JAR 文件

  <repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.xls</artifactId>
        <version>16.1.3</version>
    </dependency>
</dependencies>

在 Java 中将 Excel 转换为 XML

将Excel数据转换为XML在数据集成、Web服务交互或自定义数据存储方面非常常见。Spire.XLS支持将整个工作簿或指定工作表的数据导出为XML格式。该库提供了灵活的选项来控制XML的输出结构。

以下示例展示了如何将一个Excel工作簿转换为XML文件:

import com.spire.xls.*;

public class ExcelToXML {
    public static void main(String[] args) {
        //创建Workbook类的对象
        Workbook wb = new Workbook();

        //加载Excel文档
        wb.loadFromFile("input.xlsx");

        //保存为XML文件
        wb.saveAsXml("ToXML.xml");
    }
}
  • 首先创建一个Workbook对象,然后使用loadFromFile()加载示例的Excel文件。
  • wb.saveAsXml()方法将刚在加载的Excel文件保存为XML格式。

在 Java 中将 XML 转换为 Excel

反向转换,即将XML数据导入到Excel中,同样是常见的需求,尤其是在处理来自Web服务或配置文件的数据时。Spire.XLS能够解析XML数据并将其填充到Excel工作表中。

以下代码展示了如何将一个XML文件转换为Excel文件:

import com.spire.xls.*;

public class XmlToExcel {
    public static void main(String[] args) {
        //创建Workbook类的对象
        Workbook wb = new Workbook();

        //加载XML文档
        wb.loadFromXml("sample.xml");

        //转为xlsx格式的Excel
        wb.saveToFile("toExcel.xlsx",FileFormat.Version2013);
    }
}
  • 首先创建一个Workbook对象,然后使用loadFromXml加载XML文件。
  • 调用saveToFile()将XML文件保存为Excel工作簿。

注意: 上述XML转Excel示例中的XML解析部分是基于一个简单、扁平化的XML结构。对于复杂的、嵌套的XML结构,你需要更复杂的解析逻辑来映射到Excel的行和列。

方法补充

1.Java 将Excel转为XML

导入Jar

在程序中引入Free Spire.XLS for Java中的Spire.Xls.jar文件(该文件在lib文件夹下);如果需要通过Maven下载导入,可进行如下配置pom.xml:

<repositories>
        <repository>
            <id>com.e-iceblue</id>
            <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
        </repository>
    </repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.xls.free</artifactId>
        <version>5.1.0</version>
    </dependency>
</dependencies>

将Excel转为XML

转换时,只需要三行代码即可实现,即:

  • 创建Workbook类的对象,并通过Workbook.loadFromFile()方法加载Excel文档。
  • 调用Workbook.saveAsXml()方法保存为XML文件到指定路径。
import com.spire.xls.*;
 
public class ExcelToXML {
    public static void main(String[] args) {
        //创建Workbook类的对象
        Workbook wb = new Workbook();
 
        //加载Excel文档
        wb.loadFromFile("test.xlsx");
 
        //保存为XML文件
        wb.saveAsXml("result.xml");
    }
}

2.Java实现Excel转XML

使用JXL.JAR包,只能转换2007以前的EXCEL文件,代码如下:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
 
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
 
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
 
public class ExcelToXML_JXL_2003 {
	public static void main(String[] args) throws Exception{
		Excel_2003();
	}
	
	public static void Excel_2003() throws Exception{
		// 这里是生成工作簿
		Workbook wb = null;
		// 创建根节点;
		Element root = new Element("sheet");
		// 将根节点添加到文档中;
		Document Doc = new Document(root);
		InputStream instream = new FileInputStream("d:/AAA.xls");
		wb = Workbook.getWorkbook(instream);
		// 获取第一张Sheet表
		Sheet sheet = wb.getSheet(0);
		// 获取Sheet表中所包含的总列数
		int columns = sheet.getColumns();
		// 获取Sheet表中所包含的总行数
		int rows = sheet.getRows();
		// 获取指定单元格的对象引用
		for (int i = 0; i < rows; i++) {
			Element elements = new Element("tr");
			for (int j = 0; j < columns; j++) {
				Cell cell = sheet.getCell(j, i);
				// str[i][j]=cell.getContents();//在此创建一个二维数组,获取单元格的数据
				// 生成xml文件
				elements.addContent(new Element("cell").setText(cell.getContents())); // 填写单元格的数据。
				root.addContent(elements.detach());
			}
		}
		Format format = Format.getPrettyFormat();
		XMLOutputter XMLOut = new XMLOutputter(format);
		XMLOut.output(Doc, new FileOutputStream("d:/books_xls.xml"));
		System.out.println("Excel转换成XML成功!");
	}
}

使用poi.jar,相关的包:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
 
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
 
 
public class ExcelToXML_POI_2007 {
 
	/**
	 * 读取Excel文档
	 * @param filePath
	 * @throws Exception
	 */
	public static void read(String filePath) throws Exception {
		String fileType = filePath.substring(filePath.lastIndexOf(".") + 1, filePath.length());
		InputStream stream = new FileInputStream(filePath);
		Workbook wb = null;
		if (fileType.equals("xls")) {
			wb = new HSSFWorkbook(stream);
		} else if (fileType.equals("xlsx")) {
			wb = new XSSFWorkbook(stream);
		} else {
			System.out.println("您输入的excel格式不正确");
		}
		Sheet sheet1 = wb.getSheetAt(0);
		for (Row row : sheet1) {
			for (Cell cell : row) {
				System.out.print(cell.getStringCellValue() + "  ");
			}
			System.out.println();
		}
	}
 
	/**
	 * 生成Excel文档
	 * @param outPath
	 * @return
	 * @throws Exception
	 */
	public static boolean write(String outPath) throws Exception {
		String fileType = outPath.substring(outPath.lastIndexOf(".") + 1, outPath.length());
		System.out.println(fileType);
		// 创建工作文档对象
		Workbook wb = null;
		if (fileType.equals("xls")) {
			wb = new HSSFWorkbook();
		} else if (fileType.equals("xlsx")) {
			wb = new XSSFWorkbook();
		} else {
			System.out.println("您的文档格式不正确!");
			return false;
		}
		// 创建sheet对象
		Sheet sheet1 = (Sheet) wb.createSheet("sheet1");
		// 循环写入行数据
		for (int i = 0; i < 5; i++) {
			Row row = (Row) sheet1.createRow(i);
			// 循环写入列数据
			for (int j = 0; j < 8; j++) {
				Cell cell = row.createCell(j);
				cell.setCellValue("测试" + j);
			}
		}
		// 创建文件流
		OutputStream stream = new FileOutputStream(outPath);
		// 写入数据
		wb.write(stream);
		// 关闭文件流
		stream.close();
		return true;
	}
 
	/**
	 * Excel转换成XML
	 * @param wb
	 * @throws Exception
	 */
	private static void excelToXML(String filePath) throws Exception {
		String fileType = filePath.substring(filePath.lastIndexOf(".") + 1, filePath.length());
		InputStream stream = new FileInputStream(filePath);
		Workbook wb = null;
		if (fileType.equals("xls")) {
			wb = new HSSFWorkbook(stream);
		} else if (fileType.equals("xlsx")) {
			wb = new XSSFWorkbook(stream);
		} else {
			System.out.println("您输入的excel格式不正确");
		}
		// 创建根节点;
		Element root = new Element("sheet");
		// 将根节点添加到文档中;
		Document Doc = new Document(root);
		Sheet sheet1 = wb.getSheetAt(0);
		for (Row row : sheet1) {
			Element elements = new Element("tr");
			for (Cell cell : row) {
//				System.out.print(cell.getStringCellValue() + "  ");
				elements.addContent(new Element("cell").setText(cell.getStringCellValue())); // 填写单元格的数据。
				root.addContent(elements.detach());
			}
			Format format = Format.getPrettyFormat();
			XMLOutputter XMLOut = new XMLOutputter(format);
			XMLOut.output(Doc, new FileOutputStream("d:/books_xls.xml"));
			System.out.println();
		}
	}
 
	public static void main(String[] args) {
		try {
			ExcelToXML_POI_2007.excelToXML("d:/AAA.xlsx");
//			ExcelToXML2.write("D:" + File.separator + "out.xlsx");
//			ExcelToXML2.read("D:" + File.separator + "out.xlsx");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

另一种写法:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
 
/**
 * 
 * @描述:测试excel读取
 * 导入的jar包
 * poi-3.8-beta3-20110606.jar
 * poi-ooxml-3.8-beta3-20110606.jar
 * poi-examples-3.8-beta3-20110606.jar
 * poi-excelant-3.8-beta3-20110606.jar
 * poi-ooxml-schemas-3.8-beta3-20110606.jar
 * poi-scratchpad-3.8-beta3-20110606.jar
 * xmlbeans-2.3.0.jar
 * dom4j-1.6.1.jar
 * jar包官网下载地址:http://poi.apache.org/download.html
 * 下载poi-bin-3.8-beta3-20110606.zipp
 */
 
public class ExeclToXML {
	/** 总行数 */
	private int totalRows = 0;
	
	/** 总列数 */
	private int totalCells = 0;
 
	/** 错误信息 */
	private String errorInfo;
 
	/** 构造方法 */
	public ExeclToXML() {}
 
	/**
	 * @描述:得到总行数
	 */
	public int getTotalRows() {
		return totalRows;
	}
 
	/**
	 * @描述:得到总列数
	 */
 
	public int getTotalCells() {
		return totalCells;
	}
 
	/**
	 * @描述:得到错误信息
	 */
	public String getErrorInfo() {
		return errorInfo;
	}
 
	/**
	 * @描述:是否是2003的excel,返回true是2003
	 */
	public static boolean isExcel2003(String filePath) {
		return filePath.matches("^.+\\.(?i)(xls)$");
	}
 
	/**
	 * @描述:是否是2007的excel,返回true是2007
	 */
	public static boolean isExcel2007(String filePath) {
		return filePath.matches("^.+\\.(?i)(xlsx)$");
	}
	
	/**
	 * @描述:验证excel文件
	 */
	public boolean validateExcel(String filePath) {
		/** 检查文件名是否为空或者是否是Excel格式的文件 */
		if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) {
			errorInfo = "文件名不是excel格式";
			return false;
		}
 
		/** 检查文件是否存在 */
		File file = new File(filePath);
		if (file == null || !file.exists()) {
			errorInfo = "文件不存在";
			return false;
		}
		return true;
 
	}
 
	/**
	 * @描述:根据文件名读取excel文件
	 */
	public List<List<String>> read(String filePath) {
		List<List<String>> dataLst = new ArrayList<List<String>>();
		InputStream is = null;
		try {
			/** 验证文件是否合法 */
			if (!validateExcel(filePath)) {
				System.out.println(errorInfo);
				return null;
			}
			
			/** 判断文件的类型,是2003还是2007 */
			boolean isExcel2003 = true;
			if (isExcel2007(filePath)) {
				isExcel2003 = false;
			}
 
			/** 调用本类提供的根据流读取的方法 */
			File file = new File(filePath);
			is = new FileInputStream(file);
			dataLst = read(is, isExcel2003);
			is.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {
					is = null;
					e.printStackTrace();
				}
			}
		}
		/** 返回最后读取的结果 */
		return dataLst;
	}
 
	/**
	 * @throws Exception 
	 * @描述:根据流读取Excel文件
	 */
	public List<List<String>> read(InputStream inputStream, boolean isExcel2003) throws Exception {
		List<List<String>> dataLst = null;
		try {
			/** 根据版本选择创建Workbook的方式 */
			Workbook wb = null;
			if (isExcel2003) {
				wb = new HSSFWorkbook(inputStream);
			} else {
				wb = new XSSFWorkbook(inputStream);
			}
			dataLst = read(wb);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return dataLst;
	}
 
	/**
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 * @描述:读取数据
	 */
	private List<List<String>> read(Workbook wb) throws Exception {
		List<List<String>> dataLst = new ArrayList<List<String>>();
		
		/** 得到第一个shell */
		Sheet sheet = wb.getSheetAt(0);
 
		/** 得到Excel的行数 */
		this.totalRows = sheet.getPhysicalNumberOfRows();
 
		/** 得到Excel的列数 */
		if (this.totalRows >= 1 && sheet.getRow(0) != null) {
			this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
		}
 
		/** 循环Excel的行 */
		for (int r = 0; r < this.totalRows; r++) {
			Row row = sheet.getRow(r);
			if (row == null) {
				continue;
			}
			List<String> rowLst = new ArrayList<String>();
			/** 循环Excel的列 */
			for (int c = 0; c < this.getTotalCells(); c++) {
				Cell cell = row.getCell(c);
				String cellValue = "";
				if (null != cell) {
					// 以下是判断数据的类型
					switch (cell.getCellType()) {
					case HSSFCell.CELL_TYPE_NUMERIC: // 数字
						cellValue = cell.getNumericCellValue() + "";
						break;
					case HSSFCell.CELL_TYPE_STRING: // 字符串
						cellValue = cell.getStringCellValue();
						break;
					case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
						cellValue = cell.getBooleanCellValue() + "";
						break;
					case HSSFCell.CELL_TYPE_FORMULA: // 公式
						cellValue = cell.getCellFormula() + "";
						break;
					case HSSFCell.CELL_TYPE_BLANK: // 空值
						cellValue = "";
						break;
					case HSSFCell.CELL_TYPE_ERROR: // 故障
						cellValue = "非法字符";
						break;
					default:
						cellValue = "未知类型";
						break;
					}
				}
				rowLst.add(cellValue);
			}
			/** 保存第r行的第c列 */
			dataLst.add(rowLst);
		}
		
		/**Excel转换成XML*/
		this.excelToXML(sheet);
		
		return dataLst;
	}
 
	/***
	 * Excel转换成XML
	 * @param sheet
	 */
	private void excelToXML(Sheet sheet) throws Exception {
		// 创建根节点;
		Element root = new Element("sheet");
		// 将根节点添加到文档中;
		Document Doc = new Document(root);
 
		// 获取指定单元格的对象引用
		for (Row row : sheet) {
			Element elements = new Element("tr");
			for (Cell cell : row) {
				elements.addContent(new Element("cell").setText(cell.getStringCellValue())); // 填写单元格的数据。
				root.addContent(elements.detach());
			}
		}
		Format format = Format.getPrettyFormat();
		XMLOutputter XMLOut = new XMLOutputter(format);
		XMLOut.output(Doc, new FileOutputStream("d:/books_xls.xml"));
//		System.out.println("Excel转换成XML成功!");
	}
 
	/**
	 * @描述:main测试方法
	 */
	public static void main(String[] args) throws Exception {
		ExeclToXML poi = new ExeclToXML();
//		List<List<String>> list = poi.read("d:/AAA.xls");
		List<List<String>> list = poi.read("d:/AAA.xlsx");
		
//		if (list != null) {
//			for (int i = 0; i < list.size(); i++) {
//				System.out.print("第" + (i+1) + "行");
//				List<String> cellList = list.get(i);
//				for (int j = 0; j < cellList.size(); j++) {
//					System.out.print("    第" + (j + 1) + "列值:");
//					System.out.print("    " + cellList.get(j));
//				}
//				System.out.println();
//			}
//		}
	}
}

结语

通过本文的介绍和代码示例,我们详细探讨了如何在Java环境中,利用Spire.XLS for Java库实现Excel与XML文件的双向转换。无论是将Excel数据高效导出为XML,还是将XML数据灵活导入到Excel中进行处理,Spire.XLS都提供了直观且功能强大的API支持。掌握这些转换技巧,将极大地增强你在数据处理、系统集成和报表自动化方面的能力。希望本文能为你提供有价值的参考,助你在实际项目中更加游刃有余地处理各种文件转换需求。

到此这篇关于Java使用Spire.XLS for Java实现Excel与XML互转的文章就介绍到这了,更多相关Java Excel与XML互转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决spring security中遇到的问题

    解决spring security中遇到的问题

    这篇文章主要介绍了解决spring security中遇到的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • mybatis plus动态数据源切换及查询过程浅析

    mybatis plus动态数据源切换及查询过程浅析

    这篇文章主要介绍了mybatis plus动态数据源切换及查询过程浅析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java Collections.sort()实现List排序的默认方法和自定义方法

    Java Collections.sort()实现List排序的默认方法和自定义方法

    这篇文章主要介绍了Java Collections.sort()实现List排序的默认方法和自定义方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2017-06-06
  • java实现银行家算法(Swing界面)

    java实现银行家算法(Swing界面)

    这篇文章主要为大家详细介绍了银行家算法的java代码实现,Swing写的界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Spring Boot 集成JWT实现前后端认证的示例代码

    Spring Boot 集成JWT实现前后端认证的示例代码

    小程序、H5应用的快速发展,使得前后端分离已经成为了趋势,本文主要介绍了Spring Boot 集成JWT实现前后端认证,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • FineReport中自定义登录界面的方法

    FineReport中自定义登录界面的方法

    这篇文章主要介绍了 FineReport中自定义登录界面的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • obix协议在java中的配置和使用详解

    obix协议在java中的配置和使用详解

    这篇文章主要给大家介绍了关于obix协议在java中的配置和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-08-08
  • IDEA2020配置Git的方法步骤

    IDEA2020配置Git的方法步骤

    这篇文章主要介绍了IDEA2020配置Git的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java中文件管理系统FastDFS详解

    Java中文件管理系统FastDFS详解

    这篇文章主要介绍了Java中文件管理系统FastDFS详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • WebDriver中实现对特定的Web区域截图方法

    WebDriver中实现对特定的Web区域截图方法

    这篇文章主要介绍了WebDriver中实现对特定的Web区域截图方法,本文直接给出实现代码,需要的朋友可以参考下
    2015-06-06

最新评论