/// <summary>
/// 導出記錄
/// </summary>
/// <returns></returns>
public async Task<ActionResult> DownloadRecord()
{
//數據源
var model = new PracticalRecordModel();
// 方法
var doc = EquipWordHelper.ExportPracticalRecordReceipt(model);
using (MemoryStream ms = new MemoryStream())
{
doc.Write(ms);
// 文件名
string fileName = $"{DateTime.Now.ToString("yyyy-MM-dd")}.docx";
return File(ms.ToArray(), System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
}
處理方法:ExportPracticalRecordReceipt
public static XWPFDocument ExportPracticalRecordReceipt(PracticalRecordModel model, int type = 1)
{
var template = Folder + "PracticalRecord.docx";
using (FileStream stream = new FileStream(template, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
XWPFDocument doc = new XWPFDocument(stream);
// 注意-模板的標題要和這里一樣,模板的括號是英文的
doc.Tables[0].Rows[0].GetTableCells()[0].Paragraphs[0].Runs[0].ReplaceText("[標題]", "項目" + model.JobName + "實操考核記錄");
doc.Tables[0].Rows[1].GetTableCells()[1].Paragraphs[0].Runs[0].ReplaceText("[總包單位]", model.OrgName);
doc.Tables[0].Rows[1].GetTableCells()[3].Paragraphs[0].Runs[0].ReplaceText("[考核人員]", model.KhName);
doc.Tables[0].Rows[1].GetTableCells()[5].Paragraphs[0].Runs[0].ReplaceText("[面試日期]", model.InterviewTimeStr);
doc.Tables[0].Rows[2].GetTableCells()[1].Paragraphs[0].Runs[0].ReplaceText("[分包單位]", model.ProjectName);
doc.Tables[0].Rows[2].GetTableCells()[3].Paragraphs[0].Runs[0].ReplaceText("[實操人員]", model.ScName);
doc.Tables[0].Rows[2].GetTableCells()[5].Paragraphs[0].Runs[0].ReplaceText("[考核工種]", model.JobName);
int RowsIndex = 5;
ExportPracticalRecordListReceiptFill(model, ref doc, ref RowsIndex);
foreach (var image in model.AssessMentPaths)
{
XWPFParagraph par = doc.Tables[0].Rows[RowsIndex].GetTableCells()[0].Paragraphs[0];
XWPFRun run = par.CreateRun();
byte[] byData = GetBytesFromUrl(image);
using (MemoryStream ms = new MemoryStream(byData))
{
run.AddPicture(ms, (int)PictureType.JPEG, "10.jpg", (int)(500.0 * 9525), (int)(400.0 * 9525));
}
}
var restr = "";
doc.Tables[0].Rows[RowsIndex + 1].GetTableCells()[0].Paragraphs[1].Runs[0].ReplaceText("[實操考核結論]", restr);
return doc;
}
} /// <summary>
/// 處理動態數據 /// </summary>
/// <param name="model"></param>
/// <param name="doc"></param>
/// <param name="RowsIndex"></param>
public static void ExportPracticalRecordListReceiptFill(PracticalRecordModel model, ref XWPFDocument doc, ref int RowsIndex) { var list = model.PracticalRecordDetailList.OrderBy(x => x.Sort).ToList(); var sort = 1; foreach (var item in list) { if (RowsIndex != 5) { CT_Row m_NewRow = new CT_Row(); var MyRow = new XWPFTableRow(m_NewRow, doc.Tables[0]); // 添加行--AddRow 有2種用法,下面使用的是在文檔中間插入,doc.Tables[0].AddRow(Myrow);這種是默認在文檔末尾添加
doc.Tables[0].AddRow(MyRow, RowsIndex); var cell = MyRow.CreateCell(); var cttc = cell.GetCTTc(); var cp = cttc.AddNewTcPr(); //添加列
cp.gridSpan = new CT_DecimalNumber(); cell = MyRow.CreateCell(); cttc = cell.GetCTTc(); cp = cttc.AddNewTcPr(); cp.gridSpan = new CT_DecimalNumber(); cell = MyRow.CreateCell(); cttc = cell.GetCTTc(); cp = cttc.AddNewTcPr(); cp.gridSpan = new CT_DecimalNumber(); cp.gridSpan.val = "3"; //合並列
cell = MyRow.CreateCell(); cttc = cell.GetCTTc(); cp = cttc.AddNewTcPr(); cp.gridSpan = new CT_DecimalNumber(); cell = MyRow.CreateCell(); cttc = cell.GetCTTc(); cp = cttc.AddNewTcPr(); cp.gridSpan = new CT_DecimalNumber();
#region 第一行(這種添加行是,要復制對應行的樣式,在進行添加行,上面是自行設定合並行,大部分按照這種方式執行即可)
// 獲取 Word 文檔中的第一個表格
XWPFTable table = doc.Tables[0];
// 開始補行數了
CT_Row ctrow = table.Rows[RowsIndex].GetCTRow(); //找模板
//tables[0].RemoveRow(12); //先移除模板行
CT_Row targetRow = new CT_Row();
// 復制cell結構
foreach (CT_Tc itemtc in ctrow.Items)
{
CT_Tc addTc = targetRow.AddNewTc();
addTc.tcPr = itemtc.tcPr;//cell樣式,只包括列寬和cell對齊方式
IList<CT_P> list_p = itemtc.GetPList();
foreach (var p in list_p)
{
CT_P addP = addTc.AddNewP();
addP.pPr = p.pPr;//段落樣式
IList<CT_R> list_r = p.GetRList();
foreach (CT_R r in list_r)
{
CT_R addR = addP.AddNewR();
addR.rPr = r.rPr;//run樣式 包括字體等
List<CT_Text> list_text = r.GetTList();
foreach (CT_Text text in list_text)
{
CT_Text addText = addR.AddNewT();
addText.space = text.space;
addText.Value = text.Value;
}
}
}
}
//增加數據行
XWPFTableRow mrow = new XWPFTableRow(targetRow, table);
table.AddRow(mrow, RowsIndex);
#endregion
} //序號
XWPFParagraph para = doc.Tables[0].Rows[RowsIndex].GetTableCells()[0].Paragraphs[0]; para.Alignment = ParagraphAlignment.CENTER; XWPFRun run = para.CreateRun(); run.SetText(sort.ToString()); run.IsBold = true; sort++; // 考核項目
para = doc.Tables[0].Rows[RowsIndex].GetTableCells()[1].Paragraphs[0]; para.Alignment = ParagraphAlignment.CENTER; run = para.CreateRun(); run.SetText(item.ExamProject); run.IsBold = true; // 考核標准
para = doc.Tables[0].Rows[RowsIndex].GetTableCells()[2].Paragraphs[0]; para.Alignment = ParagraphAlignment.CENTER; run = para.CreateRun(); run.SetText(item.ExamStandard); run.IsBold = true; // 結論-合格
para = doc.Tables[0].Rows[RowsIndex].GetTableCells()[3].Paragraphs[0]; para.Alignment = ParagraphAlignment.CENTER; run = para.CreateRun(); run.SetText(item.IsQualified == 0 ? "√" : ""); run.IsBold = true; // 結論-不合格
para = doc.Tables[0].Rows[RowsIndex].GetTableCells()[4].Paragraphs[0]; para.Alignment = ParagraphAlignment.CENTER; run = para.CreateRun(); run.SetText(item.IsQualified == 1 ? "√" : ""); run.IsBold = true; RowsIndex++; } }
// 一行設置2種字體樣式--案例--和上面的代碼面關聯
XWPFParagraph para = doc.Tables[0].Rows[RowsIndex].GetTableCells()[0].Paragraphs[0];
para.Alignment = ParagraphAlignment.LEFT;
XWPFRun run = para.CreateRun();
var pointname = sort.ToString("D2") + "-" + item.PointName + ":";
run.SetText(pointname);
run.IsBold = true;
run.FontSize = 14;
run.SetFontFamily("仿宋_GB2312", FontCharRange.None);
// 添加換行符
para.CreateRun().AddCarriageReturn();
// 創建文本2,並設置其樣式
XWPFRun run2 = para.CreateRun();
run2.SetText(item.Remark);
run2.FontFamily = "仿宋_GB2312";
run2.FontSize = 10;
文件模板

導出結果
