记点笔记,加深印象!最近有个导入Excel工能需要完成,Excel列名是中文的,导入Excel我用的NPOI插件,如果不对Excel做解析,列名有可能会给我带来一些字符方面的麻烦,于是想到了一个比较low的办法,做一个Json配置文件,对应我的Excel列头,然后读取Excel时与json文件匹配,同时需要校验Excel数据是否合法,创建DataTable。主要代码如下:

1.Json文件:

[
{
"Name": "Inventory",
"CnName":"盘点单明细",
"Columns": [
{
"Name": "warehouseCode",
"CnName": "仓库编码",
"Regex": "/^[\\s\\S]*.*[^\\s][\\s\\S]*$/",
"ErrorMsg": "4rwrewrwr"
},
{
"Name": "ownerCode",
"CnName": "货主编码",
"Regex": "",
"ErrorMsg": "4rwrewrwr"
},
{
"Name": "itemCode",
"CnName": "商品编码",
"Regex": "",
"ErrorMsg": "4rwrewrwr"
},
{
"Name": "itemName",
"CnName": "商品名称",
"Regex": "",
"ErrorMsg": "4rwrewrwr"
},
{
"Name": "barCode",
"CnName": "条形码",
"Regex": "",
"ErrorMsg": "4rwrewrwr"
},
{
"Name": "quantity",
"CnName": "系统数量",
"Regex": "",
"ErrorMsg": "4rwrewrwr"
},
{
"Name": "location",
"CnName": "货位",
"Regex": "",
"ErrorMsg": "4rwrewrwr"
},
{
"Name": "expireDate",
"CnName": "过期日期",
"Regex": "",
"ErrorMsg": "4rwrewrwr"
}
]
}
]

2.接受Json文件类:

 public class Sheets
{
public string Name { get; set; }
public string CnName { get; set; }
public List<Column> Columns { get; set; }
} public class Column
{
public string Name { get; set; }
public string CnName { get; set; }
public string Regex { get; set; }
public string ErrorMsg { get; set; }
}

3.具体解析Excel函数

public static DataTable[] ReadExcelToDataTables2(string mapJsonPath, string excelPath,out string msg)
{
msg = "";
List<Sheets> listSheet = new List<Sheets>();
string jsonFile = mapJsonPath;//@"C:\Users\user\source\repos\ConsoleApp1\ConsoleApp1\Map.json";
string json = System.IO.File.ReadAllText(jsonFile, Encoding.Default);
listSheet = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Sheets>>(json);
string excelpath = excelPath; //@"C:\Users\user\Desktop\test.xls";
FileStream fs = null;
DataTable[] tables = null;
int sheetCount = ;
NPOI.HSSF.UserModel.HSSFWorkbook book = null;
NPOI.XSSF.UserModel.XSSFWorkbook workbook = null;
try
{
using (fs = new FileStream(excelpath, FileMode.Open, FileAccess.Read))
{
try
{
book = new NPOI.HSSF.UserModel.HSSFWorkbook(fs);
}
catch (Exception)
{
fs = new FileStream(excelpath, FileMode.Open, FileAccess.Read);
workbook = new XSSFWorkbook(fs);
}
if (book != null)
{
sheetCount = book.NumberOfSheets;
}
else
{
sheetCount = workbook.NumberOfSheets;
}
tables = new DataTable[sheetCount];
DataTable dt = null;
for (int sheetIndex = ; sheetIndex < sheetCount; sheetIndex++)
{
NPOI.SS.UserModel.ISheet sheet = null;
if (book != null)
{
sheet = book.GetSheetAt(sheetIndex);
}
else
{
sheet = workbook.GetSheetAt(sheetIndex);
}
if (sheet == null) continue;
NPOI.SS.UserModel.IRow row = sheet.GetRow();
if (row == null) continue;
int firstCellNum = row.FirstCellNum;
int lastCellNum = row.LastCellNum;
if (firstCellNum == lastCellNum) continue;
string tempSheetName = sheet.SheetName;
string sheetName = listSheet.Find(p => p.CnName == tempSheetName).Name;
dt = new DataTable(sheetName);
for (int i = firstCellNum; i < lastCellNum; i++)
{
string fieldTempName = row.GetCell(i).StringCellValue;
var fieldName = listSheet[sheetIndex].Columns.Find(p => p.CnName == fieldTempName).Name;
dt.Columns.Add(fieldName, typeof(string));
}
for (int i = ; i <= sheet.LastRowNum; i++)
{ DataRow dataRow = dt.Rows.Add(); for (int j = firstCellNum; j < lastCellNum; j++)
{
var cellValue = "";
if (sheet.GetRow(i).GetCell(j) != null)
{
if (sheet.GetRow(i).GetCell(j).CellType == CellType.Numeric && DateUtil.IsCellDateFormatted(sheet.GetRow(i).GetCell(j)))
{
cellValue = sheet.GetRow(i).GetCell(j).DateCellValue.ToString("yyyy/MM/dd");
}
else
{
sheet.GetRow(i).GetCell(j).SetCellType(NPOI.SS.UserModel.CellType.String);
cellValue = sheet.GetRow(i).GetCell(j).StringCellValue;
} }
string errorMsg = listSheet[sheetIndex].Columns[j].ErrorMsg;
if (!string.IsNullOrEmpty(errorMsg))
{
string regex = listSheet[sheetIndex].Columns[j].Regex;
if (!string.IsNullOrEmpty(regex))
{
Match result = Regex.Match(cellValue, regex); //正则校验
if (!result.Success)
{
msg += string.Format("Excel第{0}个sheet的第{1}行,第{2}列,数据错误:{3}\r\n", sheetIndex + , i, j+, errorMsg);
continue;
}
}
}
dataRow[j] = cellValue;
}
}
if (!string.IsNullOrEmpty(msg))
{
return new DataTable[] { };
}
tables[sheetIndex] = dt;
}
}
}
catch (Exception e)
{ throw e;
}
return tables;
}
}

NPOI+Json文件解析Excel的更多相关文章

  1. Golang Json文件解析为结构体工具-json2go

    代码地址如下:http://www.demodashi.com/demo/14946.html 概述 json2go是一个基于Golang开发的轻量json文件解析.转换命令行工具,目前支持转换输出到 ...

  2. PHP JSON文件解析并获取key、value,判断key是否存在

    /****************************************************************************** * PHP JSON文件解析并获取key ...

  3. 【微信】微信小程序 微信开发工具中新创建的json文件,编译报错VM1781:2 pages/module/module.json 文件解析错误 SyntaxError: Unexpected end of JSON input

    如果新创建报错:编译报错VM1781:2 pages/module/module.json 文件解析错误  SyntaxError: Unexpected end of JSON input 解决方法 ...

  4. Json文件解析(下)

    Json文件解析(下) 代码地址:https://github.com/nlohmann/json   从STL容器转换 任何序列容器(std::array,std::vector,std::dequ ...

  5. Json文件解析(上)

    Json文件解析(上) 代码地址:https://github.com/nlohmann/json 自述文件 alt=GitHub赞助商 data-canonical-src="https: ...

  6. Twaver的mono-desiner导出的json文件解析

    以画的交换机为例,其他大概都差不多. 利用Twaver做出交换机模型如图1所示,其中,每一个端口都是一个单独的对象.具体Twaver操作流程参见网址:http://twaver.servasoft.c ...

  7. Python实现读取json文件到excel表

    一.需求 1.'score.json' 文件内容: { "1":["小花",99,100,98.5], "2":["小王" ...

  8. json 文件解析与应用

    第一步:首先弄一个 json 文件   我这里成为 config.json 内容如下 { ": { , "desc":"中华人民共和国" }, &qu ...

  9. Json文件转Excel

    先创建一个web项目,在根目录放置需要转换的json文件,直接读取静态Json文件加载数据进行转换,代码如下: string Json = string.Empty; List<object&g ...

随机推荐

  1. Synergy使用(安装及配置)

    最近在看一篇文章,找到了一款符合我需求的软件:Synergy. Synergy可以在多台电脑上进行鼠标与键盘及剪贴板(只能共享文本)的共享.不用每台电脑都插上这些外设了... 共享文件可以参看微软出品 ...

  2. SQL Server修改表结构后批量更新所有视图

    最近修改了数据库表结构,数据同步的时候出了问题,发现很多数据明明已经修改,但是通过视图筛选出来的还是原来的数据,所以怀疑应该是视图缓存了数据,在园子里找到下面的博文,在这里做个记录备忘. 原文链接:h ...

  3. Matlab信号处理工具箱函数

    波形产生和绘图chirp 产生扫描频率余弦diric 产生Dirichlet函数或周期Sinc函数gauspuls 产生高斯调制正弦脉冲pulstran 产生脉冲串rectpuls 产生非周期矩形信号 ...

  4. JQ与JS等价代码

    选择器 //jquery var els = $(".el"); //原生方法 var els = document.querySelectorAll(".el" ...

  5. 使用打印方法时,要先引用命名空间: Using System.Drawing.Pringing

    使用打印方法时,要先引用命名空间: Using System.Drawing.Pringing PrintDocument类的重要属性和方法:属性:DocumentName  设置打印文档时要显示的文 ...

  6. Oracle安装过程出现问题---------安装Oracle11gR2先决条件检查失败

    一.错误信息当安装到“先决条件检查” 时,提示如下图所示的错误: 二.错误原因一般情况下,由于操作系统未开启默认共享,导致Oracle无法检查环境的可用性. 三.解决方法1.在运行中(或键盘按 Win ...

  7. 迷你MVVM框架 avalonjs 0.98发布

    在本版本中,avalon侧重于对组件开发的支持,可用控件达到12个,末来将大力投入对GRID,TREE等重型UI的开发中. 添加ms-widget绑定,废弃ms-ui绑定 为ms-include添加跨 ...

  8. JS nodeJs 的日期计算

    目录[-] date-utils Static Methods 静态方法 Instance Methods 接口方法 date-utils 前端引用 <script type="tex ...

  9. Solr Dismax查询解析器-深入分析

    Solr 支持多种查询解析,给搜索引擎开发人员提供灵活的查询解析.Solr 中主要包含这几个查询解析器:标准查询解析器.DisMax 查询解析器,扩展 DisMax 查询解析器(eDisMax) Di ...

  10. 网页截图API接口,一键自动生成网页截图

    背景 最近在开发一个小程序,其中有一个帮助模块,内容为帮助文章列表,文章内容为网站后台编辑的富文本格式.鉴于小程序的特殊性,其对html格式的富文本支持并不友好. 刚开始有人开发了wxparse插件, ...