文档章节

excel转xml--《从头搭建Java游戏服务器》(一)

春天花会开foryou
 春天花会开foryou
发布于 2017/05/04 13:55
字数 971
阅读 153
收藏 0

关键字 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的输出介绍到这里

© 著作权归作者所有

共有 人打赏支持
春天花会开foryou
粉丝 33
博文 3
码字总数 1998
作品 0
东城
程序员
私信 提问
寻一移动互联网,手游方向创业公司(A轮以上)加入

说 明:仅接受高端职位,高级开发或Team Leader,所有国内外外包、低端、不靠谱职位请勿联系 公司类型要求:位置深圳,移动互联网,手机游戏后端,互联网金融类型公司(A轮以上),觉得自己公...

开源中国首席情感顾问
2015/05/07
1K
15
推荐6款常用的Java开源报表制作工具

1.JasperReports是一个基于Java的开源报表工具,它可以在Java环境下像其他IDE报表工具一样来制作报表。JasperReports支持PDF、HTML、XLS、CSV和XML文件输出格式。JasperReports是当前Java开发...

李长春
2012/02/09
0
0
【广州】奇蒙传媒 招骋负表webgame java服务端的高手

奇蒙传媒是一家自主研发具有中国特色原创卡牌游戏以及多方位传媒推广服务公司。公司以推陈出新的创作理念和雄厚的资金实力,拥有卓越的创作团队及精湛的技术水平,依托原创故事,立志为中国的...

刘飞
2010/09/02
369
6
成都 某知名游戏平台背景游戏公司 招聘 java主程

Java后端主程(1名) 15-20W 作息时间:9:00-18:00能接受加班 职责描述: 负责网页游戏的服务器端架构和开发工作。 职位要求: 1、精通Java技术(J2SE的数据结构,多线程,事件机制),具有扎实...

Seliya
2012/04/16
2.5K
15
DataNucleus 4.1.0.M3 发布,持久层框架

DataNucleus AccessPlatform 4.1.0.M3 发布,此版本改进了 RDBMS, Neo4j, MongoDB, LDAP, XML 中对 Java 对象的检索以及数据存储支持。更多详情请看:http://goo.gl/tiVV1t 。 下载: http:/...

oschina
2015/04/06
682
1

没有更多内容

加载失败,请刷新页面

加载更多

追加字节能优化性能

这种方式看起来很神奇,单如果深入理解处理器架构就能理解其中的奥秘。让我们先来看看LinkedTransferQueue这个类,它使用一个内部类型来定义队列的头队列Head和尾节点tail,二这个内部类Pad...

无知的小狼
16分钟前
0
0
性能优化(JVM概念及配置)

虚拟机组成 一次编写,到处运行 Java虚拟机是对操作系统的模拟,隔离差异 2018编程语言排行榜 一个复杂的构架 虚拟机的内部概念 运行原理 编译器,解释器执行流程 内存分配-线程模型 栈帧模型...

这很耳东先生
23分钟前
2
0
Scala之初步认识与环境准备

1. 了解 Scala 1.1. 什么是 Scala Scala 是 Scalable Language 的简写,是一门多范式的编程语言。 Scala设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚...

飞鱼说编程
44分钟前
4
0
Vue项目分环境打包的实现步骤

在项目开发中,我们的项目一般分为开发版、测试版、Pre版、Prod版。Vue-cli的默认环境一只有dev和prod两个,之前每次要发布测试版或Pre版都是修改了源码中API地址后打包,这样很麻烦。如果能...

peakedness丶
44分钟前
6
0
vue+lowdb+express

搭建流程: 1.安装Node.js; 2.安装npm; 3.安装Express; 搭建流程 npm install -g express 安装 express 生成器 npm install -g express-generator 查看是否安装成功,随便输的一个命令...

Js_Mei
49分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部