从零开始搭建报表工具(二)EXCEL导入数据

前言

本篇文章是从零开始搭建报表工具系列文章的第二篇,实现在第一篇的在线填报基础上进行优化,可使用原始模板Excel上录入数据,直接Excel导入进系统使用。

可能适用的场景

  1. 表格数据中存在公式计算,可以在原始模板中使用微软表格自带的公式。
  2. 习惯使用Excel的用户,微软表格功能强大,而我们的在线表格功能单一

实现原理

graph LR 导入表格 --> 识别内容 识别内容 --> 放到制作的模板相同位置 放到制作的模板相同位置 --> 在线渲染 在线渲染-->采集数据 采集数据 --> 保存到数据库

使用流程图

graph LR 开始 --> 下载模板 下载模板 --> 添加数据 添加数据 --> 上传Excel 上传Excel --> 在线预览或修改数据 在线预览或修改数据--> 开始生成

体验网址

体验网址:http://121.41.170.62/login

项目还在一点点完善中,仅供学习参考!可能无法访问。

实现步骤

当前Excel数据源仅支持静态表格,如果你的数据源是列表方式,请查看后续文章动态表单部分。

静态表格:不存在任何新增行或插入列的表格,所有的位置都是固定不变的。

这里继续以授权委托书.xlsx为例

STEP-1 下载

原始模板即上传时的模板,如果你本地已经存在可以不用再次下载。

进入上传填报\选择模板,这里选择授权委托书,选中后页面刷新后点击开始下载

STEP-2 表格中填充数据

表格中可以使用任何公式,但要保证位置不会发生变化。

STEP-3 EXCEL上传

点击第二步-开始上传,选择携带数据的Excel表格,点击提交上传

STEP-4 预览并修改数据

点击第三步-预览数据,可修改数据。

STEP-5 提交数据并生成

点击第四步-开始生成开始生成,等待成功。

最终转化文档样式

关键源码(C#部分)

使用NPOI读取Excel文件内容。

csharp 复制代码
/// <summary>
/// 处理Excel上传 并转换成HTML
/// </summary>
/// <returns></returns>
[Authorize]
[HttpPost("/api/xxx/processExcelUpload")]
public async Task<IActionResult> ProcessExcelUpload([FromForm] ExcelUploadInput inputData)
{
   // 获取用户ID
   var authorId = User.FindFirstValue("Id");

   // 获取上传的文件
   var uploadedFile = inputData.UploadedFile;

   //验证文件大小,限制为100KB
   const int maxAllowedFileSize = 1024 * 100; //100KB
   if (uploadedFile.Length > maxAllowedFileSize)
   {
       return BadRequest("文件大小超过限制100KB.");
   }
   
   // 验证文件类型,仅支持xlsx格式
   var permittedFileTypes = new[] { "xlsx" };
   var fileExtension = Path.GetExtension(uploadedFile.FileName).TrimStart('.').ToLowerInvariant();
   if (!permittedFileTypes.Contains(fileExtension))
   {
       return BadRequest("文件格式不支持,仅支持xlsx格式.");
   }
   
   // 这里省略了危险文件过滤操作
   
   try
   {
       // 设置基础存储路径
       var baseStoragePath = "uploads";

       //生成随机文件名
       var randomFileNameWithoutExtension = Path.GetFileNameWithoutExtension(Path.GetRandomFileName());
       var newFileName = $"{randomFileNameWithoutExtension}.{fileExtension}";

       // 定义文件的存储路径
       var currentDateString = DateTime.Now.ToString("yyyy-MM-dd");
       var targetDirectoryPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", baseStoragePath, currentDateString, authorId, "data");
       var targetFilePath = Path.Combine(targetDirectoryPath, newFileName);

       // 如果目标路径不存在, 则创建目标路径
       Directory.CreateDirectory(targetDirectoryPath); 

       // 初始化文件流并将上传的文件保存到目标路径
       using (var fileStream = new FileStream(targetFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
       {
           await uploadedFile.CopyToAsync(fileStream);
           fileStream.Close();
       }

       // 将Excel转换为HTML ConvertExcelToHtml()在第一章中
       var conversionResult = NpoiHelper.ConvertExcelToHtml(targetFilePath);

       return Json(conversionResult);
   }
   catch (Exception ex)
   {
       return Json(SetResult(500, ex.Message, "服务器异常,处理失败"));
   }
}
相关推荐
间彧41 分钟前
Windows Server,如何使用WSFC+nginx实现集群故障转移
后端
间彧1 小时前
Nginx + Keepalived 实现高可用集群(Linux下)
后端
间彧1 小时前
在Kubernetes中如何部署高可用的Nginx Ingress Controller?
后端
间彧1 小时前
Ribbon负载均衡器和Nginx负载均衡器有什么区别
后端
间彧1 小时前
Nacos详解与项目实战
后端
间彧1 小时前
nginx、网关Gateway、Nacos、多个服务实例之间的数据链路详解
后端
间彧1 小时前
Nacos与Eureka在性能上有哪些具体差异?
后端
间彧1 小时前
详解Nacos健康状态监测机制
后端
间彧1 小时前
如何利用Nacos实现配置的灰度发布?
后端
毕业设计制作和分享1 小时前
springboot159基于springboot框架开发的景区民宿预约系统的设计与实现
java·spring boot·后端