正文:
基于https://github.com/monkey256/ExcelExport 开发的再次改版,
相比旧版:
1.新版支持公式导出,多语言导出
2.去除不必要的功能,优化核心代码
3.数值校验
4.描述表格与数值表格合二为一,方便查看
5.支持插入空列
6.根据定义字段导出客户端与服务器两份
7.语言包独立处理,根据语言生成多份.lua文件
主要功能
1.软件说明:
“一键导出”
对指定目录下所有.xlsx与.xls文件分别导出到输出目录下的客户端.lua与服务器.xml文件
“语言包导出”
关键词【Language】,检测到相应文件名时,根据不同语言导出多份.lua文件
2.通过命令行启动说明:
***查看帮助界面*** -h|-help
示例: tablegen2.exe -h
***一键导出*** -p handyExp
示例: tablegen2.exe -i fullPath -o outputDir -p handyExp
***按指定类型导出*** -p xml|json|lua
示例: tablegen2.exe -i fullPath -o outputDir -p lua
using System;
using System.Collections.Generic;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
using NPOI.XSSF.UserModel;
using System.Collections;
using tablegen2.common;
namespace tablegen2.logic
{
public static class TableExcelReader
{
// def表参数占位索引
private const int DEF_HEADER_INDEX = 3;
// data表参数索引
private const int DATA_HEADER_INDEX = DEF_HEADER_INDEX + 1;
// data表数据索引
private const int DATA_DATA_INDEX = DEF_HEADER_INDEX + 2;
// 根据路径读取解析xls
public static TableExcelData loadFromExcel(string filePath)
{
if (!File.Exists(filePath))
throw new Exception(string.Format("{0} 文件不存在!", filePath));
var ext = Path.GetExtension(filePath).ToLower();
if (ext != ".xls" && ext != ".xlsx")
throw new Exception(string.Format("无法识别的文件扩展名 {0}", ext));
var headers = new List<TableExcelHeader>();
var rows = new List<TableExcelRow>();
var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
// 解析xls文档核心模块
var workbook = ext == ".xls" ? (IWorkbook)new HSSFWorkbook(fs) : (IWorkbook)new XSSFWorkbook(fs);
fs.Close();
_readDataFromWorkbook(workbook, headers, rows);
return new TableExcelData(headers, rows);
}
private static void _readDataFromWorkbook(IWorkbook wb, List<TableExcelHeader> defHeader, List<TableExcelRow> rows)
{
var dataSheet = _checkSheetValidity(wb, AppData.Config.SheetNameForData);
var defHeaderIdx = new ArrayList();
var dataList = new List<List<string>>();
// 检查Sheet是否存在空行
_checkSheetIsNullRow(dataSheet, AppData.Config.SheetNameForData);
// 读取def
_readDefSheet(dataSheet, defHeader);
// 检查data首行定义字段数据
_checkHeadersFromDataSheet(dataSheet, defHeader);
// 检查data中的数值是否符合指定类型
_checkAllDataSheetValidity(dataSheet, defHeader);
// 检查data中的主键ID是否空值或重复
_checkDataSheetKeyUnique(dataSheet, defHeader, "Id");
// 读取data
_readDataSheet(dataSheet, defHeader, rows);
}
private static ISheet _checkSheetValidity(IWorkb