From 5881e7d9d939f5d0c5eb5a7aa98ae650021302be Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9B=BE=E8=89=B3?= <2836604403@qq.com>
Date: Fri, 19 Jul 2024 14:59:57 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=B8=8B=E8=BD=BD=E6=A8=A1?=
=?UTF-8?q?=E6=9D=BF=E5=92=8C=E5=AF=BC=E5=87=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../DownloadBusinessStatisticsController.cs | 252 +++++++++++++++++-
.../statistics/DownloadTemplateController.cs | 47 ++++
.../GetBusinessStatisticsController.cs | 4 +
.../GetBusinessStatisticsListController.cs | 4 +-
.../CompetitionAPI/api/MemoryStreamHelper.cs | 25 ++
5 files changed, 330 insertions(+), 2 deletions(-)
create mode 100644 CompetitionAPI/CompetitionAPI/CompetitionAPI/Controllers/statistics/DownloadTemplateController.cs
create mode 100644 CompetitionAPI/CompetitionAPI/CompetitionAPI/api/MemoryStreamHelper.cs
diff --git a/CompetitionAPI/CompetitionAPI/CompetitionAPI/Controllers/statistics/DownloadBusinessStatisticsController.cs b/CompetitionAPI/CompetitionAPI/CompetitionAPI/Controllers/statistics/DownloadBusinessStatisticsController.cs
index 6e14283..2715a48 100644
--- a/CompetitionAPI/CompetitionAPI/CompetitionAPI/Controllers/statistics/DownloadBusinessStatisticsController.cs
+++ b/CompetitionAPI/CompetitionAPI/CompetitionAPI/Controllers/statistics/DownloadBusinessStatisticsController.cs
@@ -1,5 +1,18 @@
-using Microsoft.AspNetCore.Http;
+using Competition.Common.Util;
+using CompetitionAPI.api;
+using CompetitionAPI.Util;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
+using Newtonsoft.Json;
+using NPOI.HSSF.UserModel;
+using NPOI.SS.Formula.Functions;
+using NPOI.SS.UserModel;
+using NPOI.SS.Util;
+using NPOI.XSSF.UserModel;
+using System.Data;
+using System.Drawing;
+using System.Reflection.PortableExecutable;
namespace CompetitionAPI.Controllers.statistics
{
@@ -7,5 +20,242 @@ namespace CompetitionAPI.Controllers.statistics
[ApiController]
public class DownloadBusinessStatisticsController : Controller
{
+ Competition.Mysql.BLL.v_business_statistics bll = new Competition.Mysql.BLL.v_business_statistics();
+
+ public DownloadBusinessStatisticsController()
+ {
+
+ }
+
+ ///
+ /// 下载业务统计接口
+ ///
+ /// 统计id
+ ///
+ [HttpGet]
+ public ActionResult Index(string StatisticsId)
+ {
+ try
+ {
+ var result = bll.GetModel(StatisticsId);
+ if (result != null)
+ {
+ XSSFWorkbook workbook = new NPOI.XSSF.UserModel.XSSFWorkbook();
+ ICellStyle style = workbook.CreateCellStyle();
+ style.BorderBottom = BorderStyle.Thin;
+ style.BorderLeft = BorderStyle.Thin;
+ style.BorderRight = BorderStyle.Thin;
+ style.BorderTop = BorderStyle.Thin;
+ style.WrapText = true; //若字符串过大换行填入单元格
+ style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
+ style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
+ IFont font2 = workbook.CreateFont();
+ font2.FontHeightInPoints = 18;
+ font2.FontName = "宋体";
+ font2.Boldweight = (short)FontBoldWeight.Bold; // 或者使用 short.MaxValue
+ style.SetFont(font2);
+
+ ICellStyle style2 = workbook.CreateCellStyle();
+ style2.BorderBottom = BorderStyle.Thin;
+ style2.BorderLeft = BorderStyle.Thin;
+ style2.BorderRight = BorderStyle.Thin;
+ style2.BorderTop = BorderStyle.Thin;
+ style2.WrapText = true; //若字符串过大换行填入单元格
+ style2.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
+ style2.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
+ IFont font3 = workbook.CreateFont();
+ font3.FontHeightInPoints = 12;
+ font3.FontName = "宋体";
+ style2.SetFont(font3);
+
+ ICellStyle style3 = workbook.CreateCellStyle();
+ style3.BorderBottom = BorderStyle.Thin;
+ style3.BorderLeft = BorderStyle.Thin;
+ style3.BorderRight = BorderStyle.Thin;
+ style3.BorderTop = BorderStyle.Thin;
+ style3.WrapText = true; //若字符串过大换行填入单元格
+ style3.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
+ style3.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
+ IFont font4 = workbook.CreateFont();
+ font4.FontHeightInPoints = 12;
+ font4.FontName = "宋体";
+ font4.Boldweight = (short)FontBoldWeight.Bold; // 或者使用 short.MaxValue
+ style3.SetFont(font4);
+
+ ICellStyle style4 = workbook.CreateCellStyle();
+ style4.BorderBottom = BorderStyle.Thin;
+ style4.BorderLeft = BorderStyle.Thin;
+ style4.BorderRight = BorderStyle.Thin;
+ style4.BorderTop = BorderStyle.Thin;
+ style4.WrapText = true; //若字符串过大换行填入单元格
+ style4.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
+ style4.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
+ // 获取工作簿的数据格式对象,用于创建自定义格式
+ IDataFormat dataFormat = workbook.CreateDataFormat();
+ // 定义自定义的日期格式
+ string customDateFormat = "yyyy\"年\"m\"月\"";
+ // 创建自定义格式
+ short formatId = dataFormat.GetFormat(customDateFormat);
+ style4.DataFormat = formatId;
+ IFont font5 = workbook.CreateFont();
+ font5.FontHeightInPoints = 12;
+ font5.FontName = "宋体";
+ font5.Boldweight = (short)FontBoldWeight.Bold; // 或者使用 short.MaxValue
+ style4.SetFont(font5);
+
+ ISheet sheet1 = workbook.CreateSheet("sheet1");
+ sheet1.SetColumnWidth(0, 20 * 256);
+ sheet1.SetColumnWidth(1, 20 * 256);
+ sheet1.SetColumnWidth(2, 20 * 256);
+ sheet1.SetColumnWidth(3, 20 * 256);
+ sheet1.SetColumnWidth(4, 20 * 256);
+ sheet1.SetColumnWidth(5, 20 * 256);
+ sheet1.SetColumnWidth(6, 20 * 256);
+
+ var row1 = sheet1.CreateRow(0);//选择第1行
+ // 设置行高
+ row1.HeightInPoints = 22.5f;
+ var cell1_1 = row1.CreateCell(0);//选择第1列
+ cell1_1.SetCellValue("业务统计表");
+ cell1_1.CellStyle = style;
+ var cell1_2 = row1.CreateCell(1);
+ cell1_2.SetCellValue("");
+ cell1_2.CellStyle = style;
+ var cell1_3 = row1.CreateCell(2);
+ cell1_3.SetCellValue("");
+ cell1_3.CellStyle = style;
+ var cell1_4 = row1.CreateCell(3);
+ cell1_4.SetCellValue("");
+ cell1_4.CellStyle = style;
+ var cell1_5 = row1.CreateCell(4);
+ cell1_5.SetCellValue("");
+ cell1_5.CellStyle = style;
+ var cell1_6 = row1.CreateCell(5);
+ cell1_6.SetCellValue("");
+ cell1_6.CellStyle = style;
+ var cell1_7 = row1.CreateCell(6);
+ cell1_7.SetCellValue("");
+ cell1_7.CellStyle = style;
+ sheet1.AddMergedRegion(new CellRangeAddress(0, 0, 0, 6));//合并单元格,第一行合并9列
+ var start_index = 0;
+ var previousValue = "";
+ var merge_list = new List();
+ var list = JsonConvert.DeserializeObject>(result.StatisticsContent);
+ for (int i = 0; i < list.Count; i++)
+ {
+ var row2 = sheet1.CreateRow(i + 1);//选择第1行
+ if (i == 0)
+ {
+ row2.HeightInPoints = 14.25f;
+ var cell2_1 = row2.CreateCell(0);//选择第1列
+ cell2_1.SetCellValue(list[i].BusinessLine);
+ cell2_1.CellStyle = style3;
+ var cell2_2 = row2.CreateCell(1);
+ cell2_2.SetCellValue(list[i].BusinessName);
+ cell2_2.CellStyle = style3;
+ var cell2_3 = row2.CreateCell(2);
+ cell2_3.SetCellValue(list[i].Unit);
+ cell2_3.CellStyle = style3;
+ var cell2_4 = row2.CreateCell(3);
+ cell2_4.SetCellValue(DateTime.Parse(list[i].Years));
+ cell2_4.CellStyle = style4;
+ var cell2_5 = row2.CreateCell(4);
+ cell2_5.SetCellValue(list[i].YoY);
+ cell2_5.CellStyle = style3;
+ var cell2_6 = row2.CreateCell(5);
+ cell2_6.SetCellValue(list[i].YearInterval);
+ cell2_6.CellStyle = style3;
+ var cell2_7 = row2.CreateCell(6);
+ cell2_7.SetCellValue(list[i].YearsYoY);
+ cell2_7.CellStyle = style3;
+ }
+ else
+ {
+ row2.HeightInPoints = 14.25f;
+ var cell2_1 = row2.CreateCell(0);//选择第1列
+ cell2_1.SetCellValue(list[i].BusinessLine);
+ cell2_1.CellStyle = style2;
+ var cell2_2 = row2.CreateCell(1);
+ cell2_2.SetCellValue(list[i].BusinessName);
+ cell2_2.CellStyle = style2;
+ var cell2_3 = row2.CreateCell(2);
+ cell2_3.SetCellValue(list[i].Unit);
+ cell2_3.CellStyle = style2;
+ var cell2_4 = row2.CreateCell(3);
+ cell2_4.SetCellValue(list[i].Years);
+ cell2_4.CellStyle = style2;
+ var cell2_5 = row2.CreateCell(4);
+ cell2_5.SetCellValue(list[i].YoY);
+ cell2_5.CellStyle = style2;
+ var cell2_6 = row2.CreateCell(5);
+ cell2_6.SetCellValue(list[i].YearInterval);
+ cell2_6.CellStyle = style2;
+ var cell2_7 = row2.CreateCell(6);
+ cell2_7.SetCellValue(list[i].YearsYoY);
+ cell2_7.CellStyle = style2;
+ }
+
+ if (i != 0 && i != list.Count - 1)
+ {
+ if (list[i - 1].BusinessLine != list[i].BusinessLine && list[i + 1].BusinessLine == list[i].BusinessLine)
+ {
+ start_index = i + 1;
+ previousValue = list[i].BusinessLine;
+ }
+
+ if (list[i - 1].BusinessLine == list[i].BusinessLine && list[i + 1].BusinessLine != list[i].BusinessLine)
+ {
+ if (list[i].BusinessLine == previousValue)
+ {
+ sheet1.AddMergedRegion(new CellRangeAddress(start_index, i + 1, 0, 0));
+ previousValue = "";
+ start_index = 0;
+ }
+ }
+ }
+ else if (i == list.Count - 1)
+ {
+ if (list[i - 1].BusinessLine != list[i].BusinessLine)
+ {
+ start_index = i + 1;
+ previousValue = list[i].BusinessLine;
+ }
+
+ if (list[i - 1].BusinessLine == list[i].BusinessLine)
+ {
+ if (list[i].BusinessLine == previousValue)
+ {
+ sheet1.AddMergedRegion(new CellRangeAddress(start_index, i + 1, 0, 0));
+ previousValue = "";
+ start_index = 0;
+ }
+ }
+ }
+ }
+
+ MemoryStreamHelper stream = new MemoryStreamHelper();
+
+ workbook.Write(stream);
+ stream.Flush();
+ stream.Position = 0;
+
+ sheet1 = null;
+ workbook = null;
+
+ var exam_name = result.StatisticsTime.ToString("yyyy年MM月") + "-业务统计表";
+ var ExcelName = exam_name + ".xlsx";
+ return File(stream, "application/vnd.ms-excel", ExcelName);
+ }
+ else
+ {
+ return Json(Tool.GetJsonWithCode(APICode.Fail, "未找到业务统计信息!"));
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLog(ex.Message + ",行号:" + ex.StackTrace);
+ return Json(Tool.GetJsonWithCode(APICode.Fail, "发生错误,请联系管理员。"));
+ }
+ }
}
}
diff --git a/CompetitionAPI/CompetitionAPI/CompetitionAPI/Controllers/statistics/DownloadTemplateController.cs b/CompetitionAPI/CompetitionAPI/CompetitionAPI/Controllers/statistics/DownloadTemplateController.cs
new file mode 100644
index 0000000..b00c474
--- /dev/null
+++ b/CompetitionAPI/CompetitionAPI/CompetitionAPI/Controllers/statistics/DownloadTemplateController.cs
@@ -0,0 +1,47 @@
+using Competition.Common.Util;
+using CompetitionAPI.Util;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+
+namespace CompetitionAPI.Controllers.statistics
+{
+ [Route("api/[controller]")]
+ [ApiController]
+ public class DownloadTemplateController : Controller
+ {
+ private readonly IWebHostEnvironment _webHostEnvironment;
+
+ public DownloadTemplateController(IWebHostEnvironment webHostEnvironment)
+ {
+ _webHostEnvironment = webHostEnvironment;
+ }
+
+ ///
+ /// 下载模板接口
+ ///
+ /// 模块路径
+ ///
+ [HttpGet]
+ public ActionResult Index(string FileName)
+ {
+ try
+ {
+ string web_path = _webHostEnvironment.WebRootPath;
+ var filePath = web_path + "/" + FileName;
+ //以字符流的形式下载文件
+ FileStream fs = new FileStream(filePath, System.IO.FileMode.Open);
+ byte[] bytes = new byte[(int)fs.Length];
+ fs.Read(bytes, 0, bytes.Length);
+ fs.Close();
+ string displayName = Path.GetFileName(filePath);
+ return File(bytes, "application/octet-stream", displayName);
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLog(ex.Message + ",行号:" + ex.StackTrace);
+ return Json(Tool.GetJsonWithCode(APICode.Fail, "发生错误,请联系管理员。"));
+ }
+ }
+ }
+}
diff --git a/CompetitionAPI/CompetitionAPI/CompetitionAPI/Controllers/statistics/GetBusinessStatisticsController.cs b/CompetitionAPI/CompetitionAPI/CompetitionAPI/Controllers/statistics/GetBusinessStatisticsController.cs
index 8a7a5a6..76dfdc3 100644
--- a/CompetitionAPI/CompetitionAPI/CompetitionAPI/Controllers/statistics/GetBusinessStatisticsController.cs
+++ b/CompetitionAPI/CompetitionAPI/CompetitionAPI/Controllers/statistics/GetBusinessStatisticsController.cs
@@ -27,6 +27,10 @@ namespace CompetitionAPI.Controllers.statistics
[HttpGet]
public JsonResult Index(string StatisticsTime = "")
{
+ if (string.IsNullOrEmpty(StatisticsTime))
+ {
+ return Json(Tool.GetJsonWithCode(APICode.Fail, "时间不能为空"));
+ }
var model = bll.GetModelList(" StatisticsTime='" + StatisticsTime + "' ").FirstOrDefault();
if (model == null)
{
diff --git a/CompetitionAPI/CompetitionAPI/CompetitionAPI/Controllers/statistics/GetBusinessStatisticsListController.cs b/CompetitionAPI/CompetitionAPI/CompetitionAPI/Controllers/statistics/GetBusinessStatisticsListController.cs
index 1e2d361..00b35bb 100644
--- a/CompetitionAPI/CompetitionAPI/CompetitionAPI/Controllers/statistics/GetBusinessStatisticsListController.cs
+++ b/CompetitionAPI/CompetitionAPI/CompetitionAPI/Controllers/statistics/GetBusinessStatisticsListController.cs
@@ -39,7 +39,9 @@ namespace CompetitionAPI.Controllers.statistics
query.AppendFormat(" order by CreateTime desc OFFSET {0} ROWS FETCH NEXT {1} ROWS ONLY; ", offset, PageSize);
var total = bll.GetRecordCount(total_query.ToString());
- var list = bll.GetModelList(query.ToString());
+ var data = bll.GetModelList(query.ToString());
+ var list = (from d in data
+ select new { StatisticsId = d.StatisticsId, StatisticsTime = d.StatisticsTime.ToString("yyyy年MM月"), CreateTime = d.CreateTime, Remark1 = d.Remark1, Remark2 = d.Remark2, Remark3 = d.Remark3 }).ToList();
return Json(Tool.GetJsonWithCode(APICode.Success, new { total = total, list = list }));
}
}
diff --git a/CompetitionAPI/CompetitionAPI/CompetitionAPI/api/MemoryStreamHelper.cs b/CompetitionAPI/CompetitionAPI/CompetitionAPI/api/MemoryStreamHelper.cs
new file mode 100644
index 0000000..f20f792
--- /dev/null
+++ b/CompetitionAPI/CompetitionAPI/CompetitionAPI/api/MemoryStreamHelper.cs
@@ -0,0 +1,25 @@
+namespace CompetitionAPI.api
+{
+ public class MemoryStreamHelper : MemoryStream
+ {
+ ///
+ /// 获取流是否关闭
+ ///
+ public bool IsColse
+ {
+ get;
+ private set;
+ }
+ public MemoryStreamHelper(bool colse = false)
+ {
+ IsColse = colse;
+ }
+ public override void Close()
+ {
+ if (IsColse)
+ {
+ base.Close();
+ }
+ }
+ }
+}