几种常见的操作文档的方式

  1. OLEDB        

    把整个 Excel 文件当做一个数据源来进行数据的读取操作。

    优点:实现方式简单,读取速度快。

    缺点:读取 Excel 数据的过程不太灵活,对内存的占用比较高,当数据量变的很大时,容易由于内存空间不足导致内存溢出异常。

  2. COM 组件

    通过 COM 组件 Microsoft.Office.Interop.Excel.dll 实现 Excel 文件的操作。

    优点:读取 Excel 数据非常灵活,可以实现 Excel 具有的各种数据处理功能。

    缺点:对数据的访问时基于单元格方式实现的,所以读写数据较慢,特别是当数据量较大时,访问效率问题更为突出。另一点是要求本机安装了 Office 组件。

  3. NPOI

    通过 NPOI 库实现 Excel 文件操作,可以在没有安装微软 Office 的情况下使用。详情可查看官网。

    优点:读取Excel数据速度较快,操作方式灵活。

    缺点:官方文档较少。

  4. Aspose 公司旗下的最全的一套 office 文档管理方案。支持 Word, Excel, PowerPoint, Project 等 office 文档以及 PDF 文档读写操作。

    优点:因商业驱动所以会有详细的使用文档和技术支持。

    缺点:需要收费使用。


做项目的时候遇到了一个需要将数据导出为pdf的功能,写了两天,将成果记录下来,方便下次开发作参考。

思路:先制作一个word文档模板,将模板中需要填充数据的地方插入标签,通过Spire.Doc将文档模板填充后保存为新的doc文件,然后再将doc文件通过Aspose转换为pdf文件进行输出

一、自己先设计一个word文档模板,根据自己的需求设计word文档,在需要填充数据的地方插入标签,后台插入数据的时候是根据获取标签位置将数据插入到标签的位置的。

        将制作好的word文档模板,放在后台项目中,模板就算制作好了

 二、第在项目中先安装需要的Nuget包,

 三、第三步在后台进行操作,先获取自己刚才做的word文档模板, 

注:下边代码段如果不加的话,生成的pdf会有aspose开发者的广告,引用包的版本需要与消除水印代码的版本保持一致,不一致就会报错,(我这里用的是19.12.0)

new Aspose.Words.License().SetLicense(new MemoryStream(Convert.FromBase64String("PExpY2Vuc2U+CiAgPERhdGE+CiAgICA8TGljZW5zZWRUbz5TdXpob3UgQXVuYm94IFNvZnR3YXJlIENvLiwgTHRkLjwvTGljZW5zZWRUbz4KICAgIDxFbWFpbFRvPnNhbGVzQGF1bnRlYy5jb208L0VtYWlsVG8+CiAgICA8TGljZW5zZVR5cGU+RGV2ZWxvcGVyIE9FTTwvTGljZW5zZVR5cGU+CiAgICA8TGljZW5zZU5vdGU+TGltaXRlZCB0byAxIGRldmVsb3BlciwgdW5saW1pdGVkIHBoeXNpY2FsIGxvY2F0aW9uczwvTGljZW5zZU5vdGU+CiAgICA8T3JkZXJJRD4yMDA2MDIwMTI2MzM8L09yZGVySUQ+CiAgICA8VXNlcklEPjEzNDk3NjAwNjwvVXNlcklEPgogICAgPE9FTT5UaGlzIGlzIGEgcmVkaXN0cmlidXRhYmxlIGxpY2Vuc2U8L09FTT4KICAgIDxQcm9kdWN0cz4KICAgICAgPFByb2R1Y3Q+QXNwb3NlLlRvdGFsIGZvciAuTkVUPC9Qcm9kdWN0PgogICAgPC9Qcm9kdWN0cz4KICAgIDxFZGl0aW9uVHlwZT5FbnRlcnByaXNlPC9FZGl0aW9uVHlwZT4KICAgIDxTZXJpYWxOdW1iZXI+OTM2ZTVmZDEtODY2Mi00YWJmLTk1YmQtYzhkYzBmNTNhZmE2PC9TZXJpYWxOdW1iZXI+CiAgICA8U3Vic2NyaXB0aW9uRXhwaXJ5PjIwMjEwODI3PC9TdWJzY3JpcHRpb25FeHBpcnk+CiAgICA8TGljZW5zZVZlcnNpb24+My4wPC9MaWNlbnNlVmVyc2lvbj4KICAgIDxMaWNlbnNlSW5zdHJ1Y3Rpb25zPmh0dHBzOi8vcHVyY2hhc2UuYXNwb3NlLmNvbS9wb2xpY2llcy91c2UtbGljZW5zZTwvTGljZW5zZUluc3RydWN0aW9ucz4KICA8L0RhdGE+CiAgPFNpZ25hdHVyZT5wSkpjQndRdnYxV1NxZ1kyOHFJYUFKSysvTFFVWWRrQ2x5THE2RUNLU0xDQ3dMNkEwMkJFTnh5L3JzQ1V3UExXbjV2bTl0TDRQRXE1aFAzY2s0WnhEejFiK1JIWTBuQkh1SEhBY01TL1BSeEJES0NGbWg1QVFZRTlrT0FxSzM5NVBSWmJRSGowOUNGTElVUzBMdnRmVkp5cUhjblJvU3dPQnVqT1oyeDc4WFE9PC9TaWduYXR1cmU+CjwvTGljZW5zZT4=")));

 四、操作word文档,这步应该在生成pdf之前,为了方便看,我写在了这里,我这个文档中有将

文本、表格、图片插入内容的操作,如果有其他需要可以在教程上边找,https://www.evget.com/doclib/s/21/10921

  1.  第一种的话是获取标签位置,填充内容。
    bookmarkNavigator.MoveToBookmark("LICNO", true, true);//根据模板中的标签名称,获取位置
    bookmarkNavigator.ReplaceBookmarkContent("填充的内容", true);
  2. 自定义样式,我这里是在表格替换标签的时候定义的样式。

  3. 生成表格插入到word中,成果,

     代码,

     //创建表格
    Table table = new Table(document, true);//在文档中创建表格
    table.ResetCells(20, 2);//这里是表格的行数和列数,我这里是20行,2列
    //设置表格的水平和垂直边框 
    table.TableFormat.Borders.Horizontal.BorderType = BorderStyle.Hairline;
    table.TableFormat.Borders.Horizontal.Color = Color.White;
    table.TableFormat.Borders.Vertical.BorderType = BorderStyle.Hairline;
    table.TableFormat.Borders.Vertical.Color = Color.White;//设置内边框的颜色,(我这里设置成了白色)
    //table[0, 0]这里是获取表格的位置,位置是从0开始的,我这里就是第一行第一列
    table[0, 0].AddParagraph().AppendText("| 经营异常名录");//在第一行第一列单元格填充文本
    table[0, 0].Paragraphs[0].Format.HorizontalAlignment = HorizontalAlignment.Left;//设置文本居左
    //这里是设置单元格的样式,style.Name就是上一步自定义样式的NAME,获取样式
    table[0, 0].Paragraphs[0].ApplyStyle(style.Name);
     //创建TextBodyPart对象
    TextBodyPart bodyPart = new TextBodyPart(document);
    bodyPart.BodyItems.Add(table);
    //定位到指定书签位置
    bookmarkNavigator.MoveToBookmark("模板书签的名字");
    //使用表格替换原书签的内容
    bookmarkNavigator.ReplaceBookmarkContent(bodyPart);
  4. 将图片插入到word文档中(我这里是将生成的二维码插入到了word中)成果:

     代码:

    var wjjurl = _host.WebRootPath + "/XYJG/XYBG/QrCode/";//文件夹路径
    string qrcodepath = _host.WebRootPath + "/XYJG/XYBG/QrCode/" + jgdm + ".jpg";
    if (!Directory.Exists(wjjurl))//判断文件夹路径是否存在
    {
        Directory.CreateDirectory(wjjurl);
    }
    if (!System.IO.File.Exists(qrcodepath))//判断二维码是否存在
    {
    //定义二维码扫出来的内容
    string url = "企业名称:" + enmoeamodel.QYMC + "统一社会信用代码:" + jgdm;
    
    Bitmap ImagePath = QRCodeHelper.GetPTQRCode(url, 2);//生成二维码
    ImagePath.Save(qrcodepath);//将二维码保存
    }
    //创建BookmarksNavigator实例
    BookmarksNavigator bn = new BookmarksNavigator(document);
    //模板中要替换图片的书签
    bn.MoveToBookmark("qytpimg", true, true);
    //添加一个secton并命名为section0
    Section section0 = document.AddSection();
    //为section0添加一个段落
    Paragraph paragraph = section0.AddParagraph();
    //加载一张图片
    Image image = Image.FromFile(qrcodepath);//图片的物理路径
    //为段落添加图片
    DocPicture picture = paragraph.AppendPicture(image);
    //把含有图片的段落插入到书签位置
    bn.InsertParagraph(paragraph);
    document.Sections.Remove(section0);
    

总结:这是本人做数据导出为pdf的总结文字,有的地方可能表达的不是很清楚,仅供参考

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐