学了上一节的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
2.在页面上增加点击导入按钮后需要弹出的窗口
1 @*导入*@
2
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
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 ///
15 /// 文件路径
16 /// Sheet名
17 ///
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 ///
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 ///
4 /// 文件信息
5 ///
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
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 }
有疑问随时欢迎交流
手机扫一扫
移动阅读更方便
你可能感兴趣的文章