excel转xml--《从头搭建Java游戏服务器》(一)
博客专区 > 大冯 的博客 > 博客详情
excel转xml--《从头搭建Java游戏服务器》(一)
大冯 发表于10个月前
excel转xml--《从头搭建Java游戏服务器》(一)
  • 发表于 10个月前
  • 阅读 32
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

关键字 xls转xml  xlsx转xml

 

excel对策划配置很友好,一般做为游戏的通用配置方式,但是excel文件在程序读取的时候,有一定的不方便之处:

1 excel的修改无法进行比较,程序员不知道策划每次修改了什么

2 excel读取较xml慢2倍,导致服务器启动较慢

 

本文介绍excel对xls及xlsx的转换

 

一 格式介绍

excel的格式:

 

多页或单页excel,第一行为th,表头,第二行为注释

 

xml的格式:

xml为单行xml,xml表现形式丰富,可以表现多层嵌套结构,如果excel表格规范,建议设置为单行,便于阅读

 

二 需要类包

<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
</dependency>

<dependency>
<groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.16</version>
</dependency>

选用jdom解析xml,poi解析excel,下文会介绍用jxl解析excel

 

三 Poi 

 

首先在D盘建立 excelToXml文件夹,把所需要转换的excel放在文件里,在excelToXml下建立 xml文件夹

 

package xlsToXml;

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.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
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.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

/**
 * @author dafeng
 */
public class PoiXlsAndXlsxToXml {

	/**
	 * @param path
	 *            文件夹目录
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public static void write(String path) throws FileNotFoundException, IOException {
		List<String> filelist = FileUtils.getFiles(path, ".xls", ".xlsx");
		for (String fileName : filelist) {
			// 工作簿
			Workbook wb = null;
			InputStream instream = new FileInputStream(fileName);
			try {
				// 兼容xls和xlsx
				if (fileName.endsWith(".xls")) {
					wb = new HSSFWorkbook(instream);
				} else {
					wb = new XSSFWorkbook(instream);
				}
				// 获得所有的Sheet
				Iterator<Sheet> it = wb.sheetIterator();
				while (it.hasNext()) {
					Sheet sheet = it.next();
					// 对Sheet的名字进行判断,只接收数字,英文,下划线和短横
					if (!isLetterDigit(sheet.getSheetName())) {
						continue;
					}
					System.out.println("正在生成" + fileName + "_" + sheet.getSheetName());
					// 建立根节点
					Element root = new Element("root");
					// 根节点添加到文档
					Document document = new Document(root);
					// 取出第一行(用来获取表头)
					Row rowTh = sheet.getRow(0);
					// 取得行数
					int rowNum = sheet.getLastRowNum();
					for (int i = 1; i <= rowNum; i++) {
						// 针对每一行建立元素
						Element elements = new Element("tr");
						Row row = sheet.getRow(i);
						int cellNum = 0;
						if (i == 1)
							continue;
						for (Cell cell : row) {
							// 取得表头
							String th = getValue(rowTh.getCell(cellNum));
							// 如果没有表头,跳过
							if ("".equals(th))
								continue;
							// 填写元素的属性
							elements.setAttribute(th, getValue(cell));
							root.addContent(elements.detach());
							cellNum++;
						}
					}
					// 设置XML的排版方式
					Format format = Format.getPrettyFormat();
					XMLOutputter XMLOut = new XMLOutputter(format);
					// 拼接输出文件名字,输出文件
					int index = fileName.lastIndexOf("\\");
					XMLOut.output(document,
							new FileOutputStream(fileName.substring(0, index) + "\\xml\\"
									+ fileName.substring(index, fileName.length()) + "_" + sheet.getSheetName()
									+ ".xml"));
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 由于poi输出的内容都自带类型,所以要进行转换
	 * 
	 * @param cell
	 *            格子
	 * @return 格子的String格式的内容
	 */
	public static String getValue(Cell cell) {
		CellType type = cell.getCellTypeEnum();
		switch (type) {
		case _NONE:
		case BLANK:
			return "";
		case NUMERIC:
			// poi对数字统一处理为double类型,会让填写的1变为1.0,此处做手动处理
			double doubleVal = cell.getNumericCellValue();
			long longVal = Math.round(cell.getNumericCellValue());
			if (Double.parseDouble(longVal + ".0") == doubleVal) {
				return String.valueOf((int) doubleVal);
			} else {
				return String.valueOf(doubleVal);
			}
		case BOOLEAN:
			return String.valueOf(cell.getBooleanCellValue());
		default:
			return String.valueOf(cell.getStringCellValue());
		}
	}

	public static boolean isLetterDigit(String str) {
		String regex = "^[a-z0-9A-Z_-]+$";// 指定sheetName只能包括数字,字母,下划线和短横
		// \u4e00-\u9fa5 这是汉字
		return str.matches(regex);
	}

	public static void main(String[] args) throws FileNotFoundException, IOException, JDOMException {
		// 指定文件夹路径
		write("D:\\excelToXml");
	}
}

 

 

FileUtils

 

package xlsToXml;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;

public class FileUtils {
	public static List<String> getFiles(String filePath, final String... endsWith) {
		File root = new File(filePath);
		File[] files = root.listFiles(new FileFilter() {
			@Override
			public boolean accept(File pathname) {
				String name = pathname.getName();
				for (String end : endsWith) {
					if (name.endsWith(end))
						return true;
				}
				return false;
			}
		});
		 List<String> filelist = new ArrayList<>();
		 for (File file : files) {
			 if (file.isDirectory()) {
				 getFiles(file.getAbsolutePath(), endsWith);
				 System.out.println( filePath + "所有子目录及文件" +file.getAbsolutePath());
			 } else {
				 filelist.add(file.getAbsolutePath());
				 System.out.println( filePath + "子目录" +file.getAbsolutePath());
			 }
		 }
		return filelist;
	}
}

 

四 读取

 

	public static void read(String path) throws JDOMException, IOException {
		File file = new File(path);
		SAXBuilder s = new SAXBuilder();
		Document d = s.build(file);
		Element root = d.getRootElement();
		Iterator<Element> it = root.getChildren().<Element> iterator();
		while (it.hasNext()) {
			Element e = it.next();
			List l = e.getAttributes();
			for (int i = 0; i < l.size(); i++) {
				Attribute a = (Attribute) l.get(i);
				System.out.println(a.getName() + "_" + a.getValue());
			}

		}
	}

	public static void main(String[] args) throws FileNotFoundException, IOException, JDOMException {
		String path = "D:\\excelToXml\\xml\\Equip.xlsx_Equip.xml";
		read(path);
	}

输出

id_1
type_1
price_100.01
id_2
type_2
price_389
id_3
type_3
price_231
id_4
type_2
price_432

 

excel的读取转换,xml的输出介绍到这里

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 1
博文 3
码字总数 1998
×
大冯
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: