.NET Core WebApi介面ip限流實踐 前言 之前一直想實現介面限流,但一直沒去實現,然後剛好看到一篇文章是基於AspNetCoreRateLimit 組件的限流策略。這個組件不做多的介紹,想瞭解詳情可以去訪問官方網址或者原文地址,地址在文章底部,本文只講實現。 實現介面限流步驟 導包 第 ...
背景
在工作中需要對比數據,然後輸出一份world文檔的對比報告。這需要用C#來讀寫word文件。
用到的工具
NPOI
NPOI 地址:NPOI
NPOI版本:2.6.0
個人項目的運行時版本:.NET Core 3.1
解決思路:
既然是要輸出一份報告,那麼報告的格式是固定的,只需要將報告需要改變的內容進行特殊標記,然後用具體的值替換掉即可
報告部分內容如下:
計算成功successCount,成功率successRate%
這裡的successCount 和 successRate 就是要改變的值
接下來的代碼如下
public class BuildReport
{
private string savePath;
public BuildReport()
{
if (!Directory.Exists("Report"))
{
Directory.CreateDirectory("Report");
}
savePath = Path.Combine(Directory.GetCurrentDirectory(), "Report");
}
public bool Build(string templatePath, Dictionary<string, string> replaceContent)
{
string buildedPath = $"{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}.docx";
string filePath = Path.Combine(savePath, buildedPath);
if (replaceContent.Keys.Count == 0)
{
return false;
}
if (string.IsNullOrEmpty(templatePath) || string.IsNullOrEmpty(filePath))
{
return false;
}
try
{
//讀取Word文件,併在此基礎上操作
FileStream template = new FileStream(templatePath, FileMode.Open);
//根據提供的文件,創建一個Word文檔對象
XWPFDocument doc = new XWPFDocument(template);
//獲取Word文檔的所有段落對象
IList<XWPFParagraph> paragraphs = doc.Paragraphs;
//處理替換
HandleContent(replaceContent, paragraphs);
IList<XWPFTable> tables = doc.Tables;
int i = 1;
int rowCurrent = 1;
//獲取world文檔中的表格
foreach (var item in tables)
{
//表格行
// Console.WriteLine($"**********************第{i}個表************************");
List<XWPFTableRow> rows = item.Rows;
foreach (var row in rows)
{
// Console.WriteLine($"---------------第{rowCurrent}行--------------");
List<XWPFTableCell> xWPFTableCells = row.GetTableCells();//表格單元格
foreach (var cell in xWPFTableCells)
{
//單元格
IList<XWPFParagraph> paragraphs1 = cell.Paragraphs;//單元格中的段落
HandleContent(replaceContent, paragraphs1);
}
rowCurrent++;
}
++i;
}
var newFile = File.Create(filePath);
doc.Write(newFile);
newFile.Close();
template.Close();
doc.Close();
}
catch (Exception ex)
{
throw;
}
return false;
}
/// <summary>
/// 處理要替換的值
/// </summary>
/// <param name="replaceContent">要替換的占位符及其值</param>
/// <param name="paragraphs">文檔段落</param>
private void HandleContent(Dictionary<string, string> replaceContent, IList<XWPFParagraph> paragraphs)
{
foreach (var item in paragraphs)
{
foreach (var key in replaceContent.Keys)
{
if (!item.ParagraphText.Contains(key))
{
continue;
}
item.ReplaceText(key, replaceContent[key]);
}
}
}
}
程式調用如下
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("successRate", "100");
dic.Add("successCount", "10000");
BuildReport build = new BuildReport();
build.Build("template.docx", dic);