Java XML 转 Excel 的几种方法
在 Java 中将 XML 数据转换为 Excel 文件有几种常用方法,以下是几种实现方式:

(图片来源网络,侵删)
使用 Apache POI + DOM/SAX 解析
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
public class XmlToExcel {
public static void main(String[] args) {
try {
// 1. 解析XML文件
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("input.xml"));
// 2. 创建Excel工作簿
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Data");
// 3. 获取XML根元素
Element root = document.getDocumentElement();
NodeList nodeList = root.getChildNodes();
// 4. 写入Excel
int rowNum = 0;
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
Row row = sheet.createRow(rowNum++);
// 假设每个子元素都是一列
NodeList childNodes = element.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node childNode = childNodes.item(j);
if (childNode.getNodeType() == Node.ELEMENT_NODE) {
Cell cell = row.createCell(j);
cell.setCellValue(childNode.getTextContent());
}
}
}
}
// 5. 保存Excel文件
try (FileOutputStream outputStream = new FileOutputStream("output.xlsx")) {
workbook.write(outputStream);
}
System.out.println("XML转Excel完成!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用 JAXB + Apache POI
如果XML有对应的Java类,可以使用JAXB进行转换:
import javax.xml.bind.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
public class JaxbToExcel {
public static void main(String[] args) {
try {
// 1. 使用JAXB解组XML到Java对象
JAXBContext jaxbContext = JAXBContext.newInstance(YourClass.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
YourClass root = (YourClass) unmarshaller.unmarshal(new File("input.xml"));
// 2. 创建Excel工作簿
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Data");
// 3. 写入Excel数据
// 这里需要根据你的Java对象结构来编写写入逻辑
// ...
// 4. 保存Excel文件
try (FileOutputStream outputStream = new FileOutputStream("output.xlsx")) {
workbook.write(outputStream);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用现成的库如 EasyExcel
阿里巴巴的EasyExcel库提供了更简洁的API:
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import java.util.*;
public class EasyExcelExample {
public static void main(String[] args) {
// 1. 解析XML到List对象
List<YourDataModel> dataList = parseXmlToList("input.xml");
// 2. 写入Excel
String fileName = "output.xlsx";
ExcelWriter excelWriter = EasyExcel.write(fileName, YourDataModel.class).build();
WriteSheet writeSheet = EasyExcel.writerSheet("Data").build();
excelWriter.write(dataList, writeSheet);
excelWriter.finish();
}
private static List<YourDataModel> parseXmlToList(String xmlFilePath) {
// 实现XML解析逻辑,返回List<YourDataModel>
// 可以使用DOM、SAX或JAXB
return new ArrayList<>();
}
}
使用 XStream + Apache POI
import com.thoughtworks.xstream.XStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
public class XStreamToExcel {
public static void main(String[] args) {
try {
// 1. 使用XStream解析XML
XStream xstream = new XStream();
xstream.processAnnotations(YourClass.class); // 如果使用注解
YourClass root = (YourClass) xstream.fromXML(new File("input.xml"));
// 2. 创建Excel工作簿
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Data");
// 3. 写入Excel数据
// 根据你的对象结构编写写入逻辑
// ...
// 4. 保存Excel文件
try (FileOutputStream outputStream = new FileOutputStream("output.xlsx")) {
workbook.write(outputStream);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意事项
- XML结构:以上代码假设XML结构比较简单,实际应用中需要根据你的XML结构调整解析和写入逻辑
- 性能考虑:对于大型XML文件,建议使用SAX解析而不是DOM,以避免内存问题
- 依赖:需要添加相关库的依赖,如:
- Apache POI:
org.apache.poi:poi - JAXB:
javax.xml.bind:jaxb-api - EasyExcel:
com.alibaba:easyexcel
- Apache POI:
- 异常处理:实际应用中应添加更完善的异常处理
选择哪种方法取决于你的具体需求、XML的复杂程度以及项目的技术栈,对于简单转换,方法1足够;对于复杂结构,方法2或方法3可能更合适。

(图片来源网络,侵删)
