NCF 如何导入Excel数据
简介
学了上一节的WebApi之后,我们会发现一片新天地
本节跟大家聊一聊,如何把本地的Excel数据导入到NCF中
仓库地址:https://github.com/NeuCharFramework/NCF
欢迎收藏,欢迎Star哦
步骤
1.首先在页面上需要增加可以操作导入的按钮
2.在页面上增加点击导入按钮后需要弹出的窗口
3.在窗口中增加下载导入数据的模板
4.在窗口中增加点击上传的数据的文件进行上传
5.在js中增加对应的窗口中需要处理的方法
6.引入NPOI
7.建立ExcelHelper类用来读取Excel文件内容
8.在api中增加上传数据文件的接收方法
9.在Service中处理上传的文件的数据
实施
1.首先在页面上需要增加可以操作导入的按钮
1 <el-button class="filter-item" size="mini" type="primary" @@click="handleEdit('','','import')">导入</el-button>
2.在页面上增加点击导入按钮后需要弹出的窗口
1 @*导入*@
2 <el-dialog :title="dialogImport.title"
3 :visible.sync="dialogImport.visible"
4 :close-on-click-modal="false"
5 width="700px">
6
7 <el-form ref="dataFormImport"
8 :rules="dialogImport.rules"
9 :model="dialogImport.data"
10 :disabled="dialogImport.disabled"
11 label-position="left"
12 label-width="100px"
13 style="max-width: 200px; margin-left:50px;">
14 <el-button @@click="downloadTemplate">下载导入模板</el-button>
15 <el-form-item label="导入的文件">
16 <el-upload class="upload-demo"
17 action="@Model.UpFileUrl"
18 accept=".xls,.xlsx"
19 :on-success="uploadSuccess"
20 :on-preview="handlePreview"
21 :on-remove="handleRemove"
22 :before-remove="beforeRemove"
23 multiple
24 :limit="3"
25 :on-exceed="handleExceed"
26 :file-list="fileList"
27 ref="my-upload">
28 <el-button size="small" type="primary">点击上传</el-button>
29 <div slot="tip" class="el-upload__tip">只能上传excel文件</div>
30 </el-upload>
31 <el-input class="hidden" v-model="dialogImport.data.file" clearable placeholder="文件" />
32 </el-form-item>
33 </el-form>
34 <div slot="footer" class="dialog-footer">
35 <el-button @@click="dialogImport.visible=false">取消</el-button>
36 <el-button :loading="dialogImport.updateLoading" :disabled="dialogImport.disabled" type="primary" @@click="dialogImport.visible=false">确认</el-button>
37 </div>
38 </el-dialog>
js中的代码
1 dialogImport:
2 {
3 title: '导入数据',
4 visible: false,
5 data:
6 {
7 file: ''
8 },
9 updateLoading: false,
10 disabled: false,
11 checkStrictly: true // 是否严格的遵守父子节点不互相关联
12 }
3.在窗口中增加下载导入数据的模板
这里可以本地编辑一个Excel的文件,字段可以根据自己实际的随便写
4.在窗口中增加点击上传的数据的文件进行上传
el-upload控件则是用来上传文件的
5.在js中增加对应的窗口中需要处理的方法
1 downloadTemplate() {
2 window.open("https://aaa.oss-cn-beijing.aliyuncs.com/ImportData.xls", '_blank')
3 }
6.引入NPOI
1 <PackageReference Include="NPOI" Version="2.5.3" />
7.建立ExcelHelper类用来读取Excel文件内容
1 using NPOI.SS.UserModel;
2 using System;
3 using System.Collections.Generic;
4 using System.Data;
5 using System.IO;
6 using System.Text;
7
8 namespace Senparc.Xncf.Admin.Utils
9 {
10 public class ExcelHeler
11 {
12 /// <summary>
13 /// 读取Excel多Sheet数据
14 /// </summary>
15 /// <param name="filePath">文件路径</param>
16 /// <param name="sheetName">Sheet名</param>
17 /// <returns></returns>
18 public static DataSet ReadExcelToDataSet(string filePath, string sheetName = null)
19 {
20 if (!File.Exists(filePath))
21 {
22 //logger.LogError($"未找到文件{filePath}");
23 return null;
24 }
25 //获取文件信息
26 FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
27 IWorkbook workbook = WorkbookFactory.Create(fs);
28 //获取sheet信息
29 ISheet sheet = null;
30 DataSet ds = new DataSet();
31 if (!string.IsNullOrEmpty(sheetName))
32 {
33 sheet = workbook.GetSheet(sheetName);
34 if (sheet == null)
35 {
36 //logger.LogError($"{filePath}未找到sheet:{sheetName}");
37 return null;
38 }
39 DataTable dt = ReadExcelFunc(workbook, sheet);
40 ds.Tables.Add(dt);
41 }
42 else
43 {
44 //遍历获取所有数据
45 int sheetCount = workbook.NumberOfSheets;
46 for (int i = 0; i < sheetCount; i++)
47 {
48 sheet = workbook.GetSheetAt(i);
49 if (sheet != null)
50 {
51 DataTable dt = ReadExcelFunc(workbook, sheet);
52 if (dt != null) ds.Tables.Add(dt);
53 }
54 }
55 }
56 return ds;
57 }
58
59 /// <summary>
60 /// 读取Excel多Sheet数据
61 /// </summary>
62 /// <param name="filePath">文件路径</param>
63 /// <param name="sheetName">Sheet名</param>
64 /// <returns></returns>
65 public static DataSet ReadExcelToDataSet(FileStream fs, string sheetName = null)
66 {
67 IWorkbook workbook = WorkbookFactory.Create(fs);
68 //获取sheet信息
69 ISheet sheet = null;
70 DataSet ds = new DataSet();
71 if (!string.IsNullOrEmpty(sheetName))
72 {
73 sheet = workbook.GetSheet(sheetName);
74 if (sheet == null)
75 {
76 //logger.LogError($"{filePath}未找到sheet:{sheetName}");
77 return null;
78 }
79 DataTable dt = ReadExcelFunc(workbook, sheet);
80 ds.Tables.Add(dt);
81 }
82 else
83 {
84 //遍历获取所有数据
85 int sheetCount = workbook.NumberOfSheets;
86 for (int i = 0; i < sheetCount; i++)
87 {
88 sheet = workbook.GetSheetAt(i);
89 if (sheet != null)
90 {
91 DataTable dt = ReadExcelFunc(workbook, sheet);
92 if (dt != null)
93 ds.Tables.Add(dt);
94 }
95 }
96 }
97 return ds;
98 }
99
100 /// <summary>
101 /// 读取Excel信息
102 /// </summary>
103 /// <param name="workbook">工作区</param>
104 /// <param name="sheet">sheet</param>
105 /// <returns></returns>
106 private static DataTable ReadExcelFunc(IWorkbook workbook, ISheet sheet)
107 {
108 DataTable dt = new DataTable();
109 //获取列信息
110 IRow cells = sheet.GetRow(sheet.FirstRowNum);
111 //空数据化返回
112 if (cells == null) return null;
113 int cellsCount = cells.PhysicalNumberOfCells;
114 //空列返回
115 if (cellsCount == 0) return null;
116 int emptyCount = 0;
117 int cellIndex = sheet.FirstRowNum;
118 List<string> listColumns = new List<string>();
119 bool isFindColumn = false;
120 while (!isFindColumn)
121 {
122 emptyCount = 0;
123 listColumns.Clear();
124 for (int i = 0; i < cellsCount; i++)
125 {
126 if (string.IsNullOrEmpty(cells.GetCell(i).StringCellValue))
127 {
128 emptyCount++;
129 }
130 listColumns.Add(cells.GetCell(i).StringCellValue);
131 }
132 //这里根据逻辑需要,空列超过多少判断
133 if (emptyCount == 0)
134 {
135 isFindColumn = true;
136 }
137 cellIndex++;
138 cells = sheet.GetRow(cellIndex);
139 }
140
141 foreach (string columnName in listColumns)
142 {
143 if (dt.Columns.Contains(columnName))
144 {
145 //如果允许有重复列名,自己做处理
146 continue;
147 }
148 dt.Columns.Add(columnName, typeof(string));
149 }
150 //开始获取数据
151 int rowsCount = sheet.PhysicalNumberOfRows;
152 var rowIndex = 1;
153 DataRow dr = null;
154 //空数据化返回
155 if (rowsCount <= 1) { return null; }
156 for (int i = rowIndex; i < rowsCount; i++)
157 {
158 cells = sheet.GetRow(i);
159 dr = dt.NewRow();
160 for (int j = 0; j < dt.Columns.Count; j++)
161 {
162 //这里可以判断数据类型
163 switch (cells.GetCell(j).CellType)
164 {
165 case CellType.String:
166 dr[j] = cells.GetCell(j).StringCellValue;
167 break;
168 case CellType.Numeric:
169 dr[j] = cells.GetCell(j).NumericCellValue.ToString();
170 break;
171 case CellType.Unknown:
172 dr[j] = cells.GetCell(j).StringCellValue;
173 break;
174 }
175 }
176 dt.Rows.Add(dr);
177 }
178 return dt;
179 }
180 }
181 }
8.在api中增加上传数据文件的接收方法
1 /// <summary>
2 /// 上传数据
3 /// </summary>
4 /// <param name="file">文件信息</param>
5 /// <returns></returns>
6 [HttpPost]
7 public IActionResult ImportExcelData([FromForm] IFormFile file)
8 {
9 string prefixPath = string.Empty;
10 try
11 {
12 var file_data = this.Request.Form.Files[0];
13 if (file_data == null)
14 {
15 return Fail("文件参数无效,请提供name值为file_data的文件");
16 }
17 //验证文件扩展名
18 var extension = Path.GetExtension(file_data.FileName);
19 if (!AllowFileExtension.FileExtension.Contains(extension))
20 {
21 return Fail("不支持此扩展名文件的上传!");
22 }
23 //基础存储路径
24 var basePath = "default"; // sysKeyModel.Name;
25 //验证文件前缀路径有效性
26 if (!string.IsNullOrWhiteSpace(prefixPath))
27 {
28 if (prefixPath.IndexOfAny(Path.GetInvalidPathChars()) > -1)//验证路径有效性
29 {
30 return Fail("无效路径!");
31 }
32 //进一步规范路径
33 var invalidPattern = new Regex(@"[\\\/\:\*\?\042\<\>\|]");
34 prefixPath = invalidPattern.Replace(prefixPath, "");
35
36 prefixPath = prefixPath.Replace("_", "\\");//使用下划线“_”代替斜杠“\”
37 basePath = Path.Combine(basePath, prefixPath);
38 }
39 //物理文件路径
40 var pathMp = Path.Combine(_webHostEnvironment.ContentRootPath, staticResourceSetting.CurrentValue.RootDir, basePath);
41 if (!Directory.Exists(pathMp)) Directory.CreateDirectory(pathMp);
42
43 string strFileName = file_data.FileName.Split('\\').LastOrDefault();
44
45 var filename = $"{DateTime.Now:yyyyMMddHHmmss}-{UniqueHelper.LongId()}{extension}";
46 string strFileHash = string.Empty;
47 string strFilePath = string.Empty;
48 using (var fs = new FileStream(Path.Combine(pathMp, filename), FileMode.CreateNew))
49 {
50 file_data.CopyTo(fs);
51 strFileHash = HashHelper.SHA1File(fs);//赋值文件Hash值
52 fs.Flush();
53 }
54 //开始解析Excel
55 //调用ExcelHelper方法
56 DataSet ds = ExcelHeler.ReadExcelToDataSet(Path.Combine(pathMp, filename));
57 SenparcTrace.Log($"{pathMp}----{filename}");
58 dataService.ImportDataAsync(ds);
59 return Success("导入成功");
60 }
61 catch (Exception ex)
62 {
63 return Fail(ex.Message);
64 }
65 }
9.在Service中处理上传的文件的数据
1 public void ImportDataAsync(DataSet ds)
2 {
3 if (ds != null)
4 {
5 DataTable dt = ds.Tables[0];
6 if (dt.Rows.Count > 0)
7 {
8 List<DataEntity> lstData = new List<DataEntity>();
9 for (int i = 0; i < dt.Rows.Count; i++)
10 {
11 int iRows = GetCount(_ => _.Name.Equals(dt.Rows[i][0].ToString()));
12 if (iRows > 0)
13 {
14 continue;
15 }
16 DataEntity dataItem = new DataEntity()
17 {
18 Name = dt.Rows[i][0].ToString()
19 };
20 lstData.Add(dataItem);
21 }
22 SaveObjectListAsync(lstData);
23 }
24 }
25 }
有疑问随时欢迎交流
NCF 如何导入Excel数据的更多相关文章
- SQL Server服务器上需要导入Excel数据的必要条件
SQL Server服务器上需要导入Excel数据,必须安装2007 Office system 驱动程序:数据连接组件,或者Access2010的数据库引擎可再发行程序包,这样就不必在服务器上装Ex ...
- PLSQL Developer导入Excel数据
LSQL Developer导入Excel数据 最近处理将Excel数据导入Oracle的工作比较多.之前都是采用Sqlldr命令行导入的方式处理.每次导入不同格式的Excel表数据,都需要先把Exc ...
- 导入excel数据
前提条件:先要安装好EXCEL软件. 程序中经常要用到导入excel数据的功能.其实通过ole操作excel就简单的几行代码,但记性不好,经常要用经常要找, 还是作篇笔记吧. var ExcelApp ...
- (转)PLSQL Developer导入Excel数据
场景:近来在做加班记录的统计,主要是统计Excel表格中的时间,因为我对于Excel表格的操作不是很熟悉,所以就想到把表格中的数据导入到数据库中,通过脚本语言来统计,就很方便了!但是目前来看,我还没有 ...
- 结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传、预览、提交的导入Excel数据操作流程
1.bootstrap-fileinpu的简单介绍 在前面的随笔,我介绍了Bootstrap-table表格插件的具体项目应用过程,本篇随笔介绍另外一个Bootstrap FieInput插件的使用, ...
- 基于 Aspose.Cells与XML导入excel 数据----操作类封装
前言 导入excel数据, 在每个项目中基本上都会遇到,第三方插件或者基于微软office,用的最多的就是npoi,aspose.cells和c#基于office这三种方式,其中各有各的优缺点,在这也 ...
- 【转】 如何导入excel数据到数据库,并解决导入时间格式问题
在办公环境下,经常会用到处理excel数据,如果用写程序导入excel数据到数据库那就太麻烦了,涉及解析excel,还要各种格式问题,下面简单利用数据库本身支持的功能解决这类导入问题. 准备 创建表 ...
- C#导入Excel数据常见问题
今天在做一个excle数据导入的时候遇到了一个奇葩问题,项目使用的是MVC,在VS2010里面调试的时候没有问题,可是当发布到本地IIS或服务器上时就出现了问题: 1.excel文件正在被使用: 2. ...
- Oracle导入excel数据快速方法
Oracle导入excel数据快速方法 使用PLSQL Developer工具,这个可是大名鼎鼎的Oracle DBA最常使用的工具. 在单个文件不大的情况下(少于100000行),并且目的 ...
随机推荐
- 第一章 FreeBSD之系统安装
一.默认选择 >>[Boot Multi User],按回车键 二.默认选择 >> [Install] 三.选择默认的键盘设置 >>[Select] 四.配置主机名 ...
- Charles的功能(web)
# 验证是否可以获取web端的https接口 1. 打开Charles 2.打开游览器输入数据 3. 查看Charles 4.从上图所看,能获取htpps的包数据,即可对web端进行抓包 4.char ...
- margin (子元素远离父元素边框)
如果父盒子没有设置border框着,那么他的子元素无法利用margin-top 来远离父元素的上边框 如果使用了margin-top会使子元素和父元素一起往下移 (子想离,父不设置border边框 则 ...
- 从零搭建springboot服务03-redis消息订阅
愿历尽千帆,归来仍是少年 1.所需依赖 <!-- Redis依赖 --> <dependency> <groupId>org.springframework.boo ...
- powercli The SSL connection could not be established, see inner exception. 问题解决
Connect-VIServer -Server 这里是"SSL连接不能建立......"这实际上意味着你没有一个有效的证书.如果你想连接到vCenter没有一个有效的证书,您必须 ...
- [转载]好好好centos7 安装 KVM
centos7 安装 KVM 2019-04-03 09:58:24 34 0 0 一.基础环境准备 centos7.X 最小环境安装 关闭selinux # vi /etc ...
- 二进制格式安装MySQL
二进制格式安装MySQL 下载二进制格式的mysql软件包 下载二进制格式的 mysql 软件包 [root@localhost ~]# cd /usr/src/ [root@localhost sr ...
- JDK版本升级
背景:本来安装了一个1.6版本的JDK,因为版本过低需要升级成1.8 安装过程很简单一路next,主要是遇到几个问题需要备注一下解决方法. Error opening registry key'sof ...
- Python3冒泡排序
练习:将路径为 D:\data.txt 的文件读取,并取出数字部分进行排序(不能使用内置排序方法),这里我们使用冒泡排序法 文件读取并取出数字部分(略) 一:什么叫冒泡排序 冒泡排序(Bubble S ...
- 如何在idea中将项目生成API文档(超详细)(Day_32)
1.打开要生成API文档的项目,点击菜单栏中的Tools工具,选择Generate JavaDoc 2.打开如下所示的Specify Generate JavaDoc Scope 界面 3.解释下Ot ...