开发工具与关键技术:VS 后端
作者:陈芝番
撰写时间:2020.04.19
目录
数据管理导入功能点围绕创建Excel临时表,数据导入,下载模板,保存导入数据到数据库,下载导入患者信息的模板,制作思路,控制器源代码如下,加载数据到table。
创建Excel临时表
<div class="col-12 table-responsive">
<table id="tabPatientImport"layui-filter="tabPatientImport"></table>
</div>
数据导入
<script type="text/html" id="tabPatientToolbar">
<div class="layui-btn-container">
<button type="button" class="btn btn-sm btn-primary mr-1" onclick="openImportExcel()">数据导入</button>
</div>
</script>
下载模板
function downImportTemplate() {
window.open('/Houtai/DownImportTemplate');
}
保存导入数据到数据库
function saveImport() {
var layerIndex = layer.load(0);
$.post("SaveImport", function (returnJson) {
if (returnJson.State == true) {
layer.close(layerIndex);
//关闭模态框
$("#modImportExaminee").modal("hide");
tabPatient = layuiTable.reload('tabPatient');
}
layer.alert(returnJson.Text, { icon: 1, title: "提示" });
});
}
下载导入患者信息的模板
public ActionResult DownImportTemplate(HttpPostedFileBase file)
{
string filePath = Server.MapPath("~/Document/Template/患者信息导入模板.xls");
if (System.IO.File.Exists(filePath))
{
获取文件的名称
string strfileName = Path.GetFileName(filePath);
return File(new FileStream(filePath, FileMode.Open), "application/octet-stream", strfileName);
}
else
{
return Content("模板文件不存在,请联系系统运维人员。");
}
}
制作思路:
(1)判断类型是不是: .xls
- 获取读取的文件;
- 把文件转换为二进制数组;
- 二进制数组转成内存流;
- 利用NPOI把内存流中的数据读取成工作簿Excel
(2)工作簿中有工作表
(3)工作表有数据
(4)数据准确性
(5)数据都有,然后读取数据。
控制器源代码如下:
try
{
把session中的ImportExcel移除避免残留以前数据
Session.Remove("ImportExcel");
获取文件的后缀
(1)判断类型是不是: .xls
string fileExtension = Path.GetExtension(file.FileName);
if (".xls".Equals(fileExtension) || ".XLS".Equals(fileExtension))
{
声明二进制数组存放文件
byte[] fileBytes = new byte[file.ContentLength];
将传入的文件转化为二进制的数组存入fileBytes
file.InputStream.Read(fileBytes, 0, file.ContentLength);
将二进制数组转化为内存流
MemoryStream excelFileStream = new MemoryStream(fileBytes);
将内存流转化为工作簿
NPOI.SS.UserModel.IWorkbook workbook = new HSSFWorkbook(excelFileStream);
(2)工作簿中有工作表
if (workbook.NumberOfSheets > 0)
{
对象列表
List<Patient> listStudentVo = new List<Patient>();
获取第一个工作表
NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0);
(3)工作表有数据
判断工作表中是否有数据
if (sheet.PhysicalNumberOfRows > 0)
{
(4)数据准确性
定义datatable
DataTable dtExcel = new DataTable();
将数据先装到datatable中
获取标题行--- 第二行,索引为1;第一行是说明
NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(1);
获取表格列数
int cellCount = rowHeader.LastCellNum;
获取表格行数
int rowCount = sheet.LastRowNum + 1;
创建dataTable中的列,循环添加标题行中各个单元格的值
for (int i = rowHeader.FirstCellNum; i < cellCount; i++)
{
通过遍历行中的每一个单元格,获取标题行各个单元格的数据
DataColumn dtColumn = new DataColumn(rowHeader.GetCell(i).StringCellValue);
将获取到的标题行的数据放到datatable中;
dtExcel.Columns.Add(dtColumn);
}
读取Excel中的数据
(sheet.FirstRowNum) 第一行是说明;第二行是标题;第三行开始才是数据信息
for (int i = (sheet.FirstRowNum) + 2; i < rowCount; i++)
{
获取行(1、2、3...)数据
NPOI.SS.UserModel.IRow row = sheet.GetRow(i);//1
创建DataTable行
DataRow dtRow = dtExcel.NewRow();
if (row != null)
{
遍历excel中一行的所有单元格
for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null)
{
dtRow[j] = row.GetCell(j).ToString();
}
}
}
将填入数据的dtRow添入dtExcel
dtExcel.Rows.Add(dtRow);
}
int intSuccess = 0;
int intFail = 0;
加载数据到table
function upExcel()
{
避免取消选择文件后触发上传
if ($('#fileUploadExecl').val() == "" || $('#fileUploadExecl').val() == undefined) {
return;
}