之前有个Asp.Net项目中需要从Excel中里导入数据,导出合同及合同的借据,心想着就用办公室提供的提供的那堆DLL库吧,简单方便,可是这堆DLL库严重依赖办公室,不可能在服务器上装个办公吧吧。于是Google了一下,搜出来那么一两个可以使用的库,一个是【NPOI  】,另外一个是【FreeSpire.Office】.FreeSpire.Office的API相对NPOI  的API要相对简单一些.FreeSpire.Office的正式版要收费,比如要使用到Spire.Office的一些功能(如:导出超过三页的PDF格式,EXCEL的Sheet创建五个以上等)就要收费了。

根据项目的情况,经过简单的分析,最后决定采用免费版的FreeSpire.Office,做一些复杂一点的操作时再用NPOI  。

这里先讲解一下项目中使用到的FreeSpire.Office的功能。

一,使用FreeSpire.Office从Excel中里读取数据

先准备存有数据的出色文件:

读取数据的C#代码(忘了之前那段读取的代码在哪了,所以有写了段示例意思意思)

public static List<Person> FromExcel(string filePath)
{   if (!File.Exists(filePath)){throw new Exception("文件不存在");}List<Person> ps = new List<Person>();try{Workbook workbook = new Workbook();workbook.LoadFromFile(filePath);//加载excel文件//获取第一个SheetWorksheet sheet = workbook.Worksheets[0];//循环读取数据int count = 2;while (true){if (string.IsNullOrEmpty(sheet.Range[$"A{count}"].Text)) { break; }ps.Add(new Person(){Name = sheet.Range[$"A{count}"].Text,Gender = sheet.Range[$"B{count}"].Text});count++;}}catch{throw;}return ps;
}

二,使用FreeSpire.Office把数据写出在擅长里

准备要写入的数据:

Dictionary<string, string> dict = new Dictionary<string, string>();//单元格位置,内容
{                    dict.Add("A3", $"合同编号:{m2.LoanAgreementNO}");dict.Add("E3", $"担保合同编号:{m2.GuaranteeNO}");dict.Add("B7", $"(币种)人民币:{m2.MoneyDaXue}");dict.Add("P8", m2.MoneyFeng);//分dict.Add("O8", m2.MoneyJiao);//角dict.Add("N8", m2.MoneyYuan);//元dict.Add("M8", m2.MoneyShi);//十dict.Add("L8", m2.MoneyBai);//百dict.Add("K8", m2.MoneyQian);//千dict.Add("J8", m2.MoneyWan);//万dict.Add("I8", m2.MoneyShiWan);//十万dict.Add("H8", m2.MoneyBaiWan);//百万dict.Add("G8", m2.MoneyQianWan);//千万dict.Add("C9", $"{m2.StartDtYear}年{m2.StartDtMonth}月{m2.StartDtDay}日至{m2.EndDtYear}年{m2.EndDtMonth}月{m2.EndDtDay}日共{m2.Deadline}个月");dict.Add("G9", $"借款方式:{m2.JKFS}");dict.Add("j9", $"月利率:{m2.InteresRate}%");dict.Add("M9", $"还款方式:{m2.HKFS}");dict.Add("P22", m2.MoneyFeng);//分dict.Add("O22", m2.MoneyJiao);//角dict.Add("N22", m2.MoneyYuan);//元dict.Add("M22", m2.MoneyShi);//十dict.Add("L22", m2.MoneyBai);//百dict.Add("K22", m2.MoneyQian);//千dict.Add("J22", m2.MoneyWan);//万dict.Add("I22", m2.MoneyShiWan);//十万dict.Add("H22", m2.MoneyBaiWan);//百万dict.Add("G22", m2.MoneyQianWan);//千万dict.Add("C23", $"{m2.StartDtYear}年{m2.StartDtMonth}月{m2.StartDtDay}日至{m2.EndDtYear}年{m2.EndDtMonth}月{m2.EndDtDay}日共{m2.Deadline}个月");dict.Add("G23", $"借款方式:{m2.JKFS}");dict.Add("j23", $"月利率:{m2.InteresRate}%");dict.Add("M23", $"还款方式:{m2.JKFS}");dict.Add("P36", m2.MoneyFeng);//分dict.Add("O36", m2.MoneyJiao);//角dict.Add("N36", m2.MoneyYuan);//元dict.Add("M36", m2.MoneyShi);//十dict.Add("L36", m2.MoneyBai);//百dict.Add("K36", m2.MoneyQian);//千dict.Add("J36", m2.MoneyWan);//万dict.Add("I36", m2.MoneyShiWan);//十万dict.Add("H36", m2.MoneyBaiWan);//百万dict.Add("G36", m2.MoneyQianWan);//千万dict.Add("C37", $"{m2.StartDtYear}年{m2.StartDtMonth}月{m2.StartDtDay}日至{m2.EndDtYear}年{m2.EndDtMonth}月{m2.EndDtDay}日共{m2.Deadline}个月");dict.Add("G37", $"借款方式:{m2.JKFS}");dict.Add("j37", $"月利率:{m2.InteresRate}%");dict.Add("M37", $"还款方式:{m2.JKFS}");
}

写入的方法:

public static class ToExcel
{ /// <summary>/// /// </summary>/// <param name="yuanPath">模板路径</param>/// <param name="mubiaoPath">目标路径</param>/// <param name="dict">需要替换的excel的单元格及字符串</param>/// <returns></returns>public static bool ToExcelByMuban(string yuanPath,string mubiaoPath,Dictionary<string,string> dict) {if (dict == null){throw new Exception("字典为空!");}if (!File.Exists(yuanPath)){throw new Exception("指定路径的模板文件不存在!");}try{Workbook book = new Workbook();book.LoadTemplateFromFile(yuanPath);Worksheet sheet = book.Worksheets[0];foreach (var d in dict){sheet.Range[d.Key].Text = d.Value;}book.SaveToFile(mubiaoPath, ExcelVersion.Version97to2003);return true;}catch{return false;}}
}

调用写入方法:

bool b1 = ToExcel.ToExcelByMuban(JieJuYuanUrl, Server.MapPath(JieJuMubiaoUrl),dict);

三,使用FreeSpire.Office根据Wrod文档模板导出合同

1.准备文档模板

2.在文字文档中制定要替换的内容

以上图中的编号举例说明:

调出字中的【开发工具】选项卡

【文件】 - >【选项】 - >【自定义公能区】 - >勾选【开发工具】 - >确认

选中要替换的位置:【开发工具】,【工具箱】,【旧式窗体】,【AB |】插入一个【文本域(窗体控件)】

添加唯一标识符:选中上一步骤添加的【文本域(窗体控件)】,双击,调出【文本域(窗体控件)】选项,填写【书签】

导出合同的方法:

/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="mod">对象(其中的字段的名称和word模板文档中【文本域(窗体控件)】的【书签】的名称一致)</param>
/// <param name="TempleteFilePath">模板文档目录</param>
/// <param name="ExpFilePath">导出文件的目录</param>
/// <returns></returns>
public static bool ExportWordByFields<T>(T mod, string TempleteFilePath, string ExpFilePath)
{if (mod == null){throw new Exception("模型为空!");}System.Reflection.PropertyInfo[] properties = mod.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);if (properties.Length <= 0){throw new Exception("模型属性为空!");}if (!File.Exists(TempleteFilePath)){throw new Exception("指定路径的模板文件不存在!");}try{Document doc = new Document();doc.LoadFromFile(TempleteFilePath);#region 替换文字//doc.Replace("海关", "海关口岸", true, true);//doc.Replace("报验", "报检", true, true);#endregion//清除表单域阴影doc.Properties.FormFieldShading = false;FormFieldCollection collection = doc.Sections[0].Body.FormFields;//遍历Word模板中的文本域(field.name为文本域名称)foreach (FormField field in collection){foreach (System.Reflection.PropertyInfo prop in properties){string name = prop.Name; //属性名称  object value = prop.GetValue(mod, null);  //属性值  //string des = ((DescriptionAttribute)Attribute.GetCustomAttribute(prop, typeof(DescriptionAttribute))).Description;// 属性描述值//注意:文本域名称 == 模型中属性的 Description 值 !!!!!!//也可以: 文本域名称 == 模型中属性的 Name 值 !!!!!!if (field.Name == name && value != null){if (field.DocumentObjectType == DocumentObjectType.TextFormField)   //文本域{if (prop.PropertyType.Name == "Boolean"){if ((Boolean)value){field.Text = "☑";   //插入勾选符号}else{field.Text = "⬜";   //插入勾选符号}break;}else{field.Text = value.ToString();   //向Word模板中插入值break;}}else if (field.DocumentObjectType == DocumentObjectType.CheckBox)   //复选框{(field as CheckBoxFormField).Checked = (value as bool?).HasValue ? (value as bool?).Value : false;}}}}doc.Protect(ProtectionType.AllowOnlyReading, Guid.NewGuid().ToString());//加密文档doc.SaveToFile(ExpFilePath, FileFormat.Docx);doc.Close();return true;}catch (Exception ex){throw new Exception(ex.Message);}
}

在上面导出合同中没有涉及到循环导出的问题

该项目还有另外一中合同涉及到多人一起签署合同的情况,需要把合同的签署人一起到处

我的办法是,在模板里添加一个一行一列的表格,弄成无边框的,

在代码中拼接内容,在把内容添加到表格中(因为合同中有三个地方需要添加,所以弄了三个表格,另外两个地方是以表格的形式显示的)

TableCollection tableCollection = doc.Sections[0].Tables;//获取文档内的所有表格
int i = 0;
foreach (Table v in tableCollection)
{int j = 0;foreach (EMultilevelJointInsurance c in eMultilevelJointInsurances){if (i == 0){Paragraph p = v.Rows[0].Cells[0].AddParagraph();p.AppendText("联保人:").CharacterFormat.FontSize = 15;TextRange range = p.AppendText(c.Name);range.CharacterFormat.UnderlineStyle = UnderlineStyle.Single;range.CharacterFormat.FontSize = 15;p.AppendText("身份证号码:").CharacterFormat.FontSize = 15;TextRange rangeId = p.AppendText(c.IDCardNo);rangeId.CharacterFormat.FontSize = 15;rangeId.CharacterFormat.UnderlineStyle = UnderlineStyle.Single;p.AppendText("\n");p.AppendText("居住地址:").CharacterFormat.FontSize = 15;TextRange rangeAdd = p.AppendText(c.ResidenceAddress);rangeAdd.CharacterFormat.FontSize = 15;rangeAdd.CharacterFormat.UnderlineStyle = UnderlineStyle.Single;}else if (i == 1){v.AddRow();Paragraph p = v.Rows[j + 1].Cells[0].AddParagraph();p.Format.HorizontalAlignment = HorizontalAlignment.Center;p.AppendText((j + 1).ToString());Paragraph p1 = v.Rows[j + 1].Cells[1].AddParagraph();p1.Format.HorizontalAlignment = HorizontalAlignment.Center;p1.AppendText(c.Name);Paragraph p2 = v.Rows[j + 1].Cells[2].AddParagraph();p2.Format.HorizontalAlignment = HorizontalAlignment.Center;p2.AppendText(c.IDCardNo);Paragraph p3 = v.Rows[j + 1].Cells[3].AddParagraph();p3.Format.HorizontalAlignment = HorizontalAlignment.Center;p3.AppendText((c.ApprovalQuota * 10000).ToString());Paragraph p4 = v.Rows[j + 1].Cells[4].AddParagraph();p4.Format.HorizontalAlignment = HorizontalAlignment.Center;p4.AppendText(c.LoanUsage);CellFormat cellStyle = v.Rows[j + 1].Cells[0].CellFormat;cellStyle.VerticalAlignment = VerticalAlignment.Middle;}else if(i == 2){v.AddRow();Paragraph p = v.Rows[j + 2].Cells[0].AddParagraph();p.Format.HorizontalAlignment = HorizontalAlignment.Center;p.AppendText(c.Name + $"({j + 1})");Paragraph p1 = v.Rows[j + 2].Cells[3].AddParagraph();p1.Format.HorizontalAlignment = HorizontalAlignment.Center;p1.AppendText(c.IDCardNo);CellFormat cellStyle = v.Rows[j + 1].Cells[0].CellFormat;cellStyle.VerticalAlignment = VerticalAlignment.Middle;}j++;}i++;
}

随便也说了一下word中表格的简单操作

四,使用FreeSpire.Office根据Wrod文档模板到处借据

同样也准备借据的模板:

根据以上借据分析,只有【联保成员】需要循环获取,其他地方只需要用【文本域(窗体控件)】替换旧可以了

我的做法是把联保人所涉及到的行全部删除,在导出的时候,把联保组长所在的行复制下来,再替换其内容

所以代码变成如下的了

TableCollection tableCollection = doc.Sections[0].Tables;//获取文档内的所有表格foreach (Table v in tableCollection)
{//组长v.Rows[0].Cells[1].Paragraphs[0].Text = insurance.Name;//联保组织姓名//v.Rows[0].Cells[3].Paragraphs[0].Text = "建行";//开户行//v.Rows[0].Cells[5].Paragraphs[0].Text = "6217 0039 10000 853";//银行账号v.Rows[1].Cells[1].Paragraphs[0].Text = $"(大写)人民币{insurance.MoneyDaXue}元";//大写的金额v.Rows[2].Cells[2].Paragraphs[0].Text = insurance.MoneyBaiWan;//百v.Rows[2].Cells[3].Paragraphs[0].Text = insurance.MoneyShiWan;//十v.Rows[2].Cells[4].Paragraphs[0].Text = insurance.MoneyWan;//万v.Rows[2].Cells[5].Paragraphs[0].Text = insurance.MoneyQian;//千v.Rows[2].Cells[6].Paragraphs[0].Text = insurance.MoneyBai;//百v.Rows[2].Cells[7].Paragraphs[0].Text = insurance.MoneyShi;//十v.Rows[2].Cells[8].Paragraphs[0].Text = insurance.MoneyYuan;//元v.Rows[2].Cells[9].Paragraphs[0].Text = insurance.MoneyJiao;//角v.Rows[2].Cells[10].Paragraphs[0].Text = insurance.MoneyFeng;//分int i = 0;foreach (EMultilevelJointInsurance c in eMultilevelJointInsurances){//把联保组长的【行】复制下来v.Rows.Insert((3 * i) + 3, v.Rows[0].Clone());v.Rows.Insert((3 * i) + 4, v.Rows[1].Clone());v.Rows.Insert((3 * i) + 5, v.Rows[2].Clone());v.Rows[(3 * i) + 3].Cells[0].Paragraphs[0].Text = $"联保成员({i + 1})";v.Rows[(3 * i) + 3].Cells[1].Paragraphs[0].Text = c.Name;v.Rows[(3 * i) + 3].Cells[3].Paragraphs[0].Text = "";//开户行v.Rows[(3 * i) + 3].Cells[5].Paragraphs[0].Text = "";//银行账号v.Rows[(3 * i) + 4].Cells[1].Paragraphs[0].Text = $"(大写)人民币{c.MoneyDaXue}元";//大写的金额v.Rows[(3 * i) + 5].Cells[2].Paragraphs[0].Text = c.MoneyBaiWan;//百v.Rows[(3 * i) + 5].Cells[3].Paragraphs[0].Text = c.MoneyShiWan;//十v.Rows[(3 * i) + 5].Cells[4].Paragraphs[0].Text = c.MoneyWan;//万v.Rows[(3 * i) + 5].Cells[5].Paragraphs[0].Text = c.MoneyQian;//千v.Rows[(3 * i) + 5].Cells[6].Paragraphs[0].Text = c.MoneyBai;//百v.Rows[(3 * i) + 5].Cells[7].Paragraphs[0].Text = c.MoneyShi;//十v.Rows[(3 * i) + 5].Cells[8].Paragraphs[0].Text = c.MoneyYuan;//元v.Rows[(3 * i) + 5].Cells[9].Paragraphs[0].Text = c.MoneyJiao;//角v.Rows[(3 * i) + 5].Cells[10].Paragraphs[0].Text = c.MoneyFeng;//分i++;}
}

五,使用NPOI  导出数据到Excel中

因为要导出的数据较多,而FreeSpire.Office免费版限制,所以使用NPOI,这里只给出代码

private bool ExportToExcelAll(ISession iSession, List<EAssessmentResult> es,string path,string fileName)
{try{EAssessmentResultDetail.Schema s = new EAssessmentResultDetail.Schema();XSSFWorkbook book = new XSSFWorkbook();int i = 0;foreach (EAssessmentResult e in es){var sheet = book.CreateSheet($"{i + 1}-{e.FullPathName}"); //创建工作表var row_Title = sheet.CreateRow(0); //创建列头行row_Title.CreateCell(0).SetCellValue("指标名称"); //创建单元格row_Title.CreateCell(1).SetCellValue("指标类型"); //创建单元格row_Title.CreateCell(2).SetCellValue("评分"); //创建单元格row_Title.CreateCell(3).SetCellValue("权重"); //创建单元格row_Title.CreateCell(4).SetCellValue("考评分数"); //创建单元格int j = 1;double total = 0;List<EAssessmentResultDetail> lst = QAssessmentResultDetail.Get(iSession, s.AssessmentResultsID == e.AssessmentResultsID, null);foreach (EAssessmentResultDetail d in lst){var row = sheet.CreateRow(j); row.CreateCell(0).SetCellValue(d.Name); //创建单元格row.CreateCell(1).SetCellValue(d.IndicatorsTypeName); //创建单元格row.CreateCell(2).SetCellValue(d.Rating.ToString()); //创建单元格row.CreateCell(3).SetCellValue(d.Weights.ToString()); //创建单元格row.CreateCell(4).SetCellValue(d.Score.ToString()); //创建单元格total += d.Score;                        j++;}var rowTotal = sheet.CreateRow(j);rowTotal.CreateCell(0).SetCellValue("总分");rowTotal.CreateCell(4).SetCellValue(total.ToString());i++;}if (!Directory.Exists(Server.MapPath(path))){Directory.CreateDirectory(Server.MapPath(path));}FileStream fs2 = File.Create(Server.MapPath(path + fileName));book.Write(fs2);fs2.Close();}catch(Exception ex){throw ex;}return true;
}

C#操作Word文档--使用FreeSpire.Office相关推荐

  1. 【C#】C#使用Microsoft.Office.Interop.Word操作Word文档,向表格插入图片

    上篇:[C#]C#使用Microsoft.Office.Interop.Word操作Word文档,替换文本 Word模板: 代码: try {Application app = new Applica ...

  2. ASP.NET操作Word文档(转)

    ASP.NET操作Word文档(转) 操作WORD配置说明 引入:Word的对象库文件"MSWORD.OLB"(word 2000为MSWORD9.OLB) 1.运行Dcomcnf ...

  3. C#操作word文档(二)

    1.C#操作Word完全功略 导入COM库:Microsoft word 11.0 Object Library. 引用里面就增加了: 创建新Word               object oMi ...

  4. Java操作Word文档

    Java 生成 Word 的几种方案 参考 ​ 主要有这么一些工具可以使用 Jacob.Apache POI.Java2word.iText,还有一种方法是使用XML作为模板. ​ 使用 XML 的思 ...

  5. java使用jacob操作word文档

    ava使用jacob操作word文档 java调用com组件操作word使用总结(jacob) 简单描述 在此处输入简单摘要 特别声明:使用java-com技术可以完成任何VBA可以完成的office ...

  6. poi操作word文档总结

    POI分段落生成纯Word动态模板并导入数据 导出数据,可以用word另存为xml格式的ftl文件,变量用${变量名}表示,然后在类中通过 freemarker去替换变量. 但是怎么导入word数据. ...

  7. 浅谈Word.Application,关于js操作word文档的使用

    这篇文章只是说个人放个笔记在这里,并没有讲解的意思,但为了进来的朋友能知道我在说啥,写的过程中我还是简单介绍一下. 官网地址:https://docs.microsoft.com/zh-cn/offi ...

  8. 使用poi操作word文档实现套打功能

    使用poi操作word文档实现套打功能 本文目的是为了分享一个实现套打功能,但是不同于简单的word的文本替换而是采用poi对word的文本框就行操作实现的功能: poi中各种jar的说明 套打的实现 ...

  9. docx4j操作word文档之生成页码、合并多个文档

    docx4j操作word文档: 动态生成表格行数并填充数据 单元格内填充图片 合并多个word文档(包含页码,纸张方向等等) 1.动态生成表格行数并填充数据 首先创建模板文件.docx,如图: 代码如 ...

最新文章

  1. C# 删除文件错误 access denied
  2. iOS知识小集·NSNumber to NSString出错啦
  3. 外观模式(Facade)
  4. mysql怎么维护_Navicat for MySQL 如何管理和维护表
  5. 用proxool配置数据库连接池步骤
  6. 2017下半年网络规划设计师考试下午真题
  7. chrome浏览器,开发工具一些常用快捷键
  8. 怎么用计算机求浮动额,2015计算机一级考试MSOFFICE上机综合训练(5)
  9. 如何在Scala中使用条件表达式 .
  10. golang | 空结构体struct{}的用法
  11. SpringBoot系列: 所有配置属性和官方文档
  12. VHDL计算机硬件能直接执行吗,第5章 VHDL程序结构.ppt
  13. Tesseract-OCR样本训练方法
  14. Hadoop3.2.0 HDFS HA ( Quorum Journal Manager )
  15. 福建省第二届“闽盾杯”部分Write Up
  16. mysql建索引 heidi_MySQL使用HeidiSQL工具改库名
  17. sas univariate 结果解释_SAS 常用过程之 PROC UNIVARIATE
  18. 2021年南阳五中高考成绩查询,南阳五中:召开2021年春期高三一模考试表彰会暨高考冲刺动员会...
  19. 初创合伙公司如何分配股权
  20. 手把手教你安装 Win+Ubuntu 双系统(图文教程)

热门文章

  1. 《罗辑思维》读书笔记PPT模板
  2. 35岁危机,如何解?40岁财务自由,可能吗?
  3. 百褶裙怎么画?怎样才能画好女生百褶裙?
  4. 安徽省计算机vfp,安徽省计算机二级VFP理论考试模拟题
  5. 关于使用库pymysql连接不上数据库的一个解决方法
  6. m3u8视频格式分析
  7. 你永远赚不到,超出认知范围外的钱
  8. 【python爬虫】在scrapy中利用代理IP(爬取BOSS直聘网)
  9. 科研油猴脚本使用记录
  10. 5.7黄金价格行情走势预测、原油价格走势及非农现价喊单