基于NPOI导入导出excel的工具,方便灵活

ExcelCtr使用说明

一、概述

基于NPOI的一种导出Excel工具,访问数据库操作依赖于DBUtil(https://github.com/jackletter/DBUtil.Standard)

二、功能

(1). 直接将DataTable或DataSet导出成excel
(2). 使用模板将DataTable或DataSet导出成excel
(3). 使用模板将泛型List导出成excel
(4). 支持导出二维码
(5). 直接使用模板去数据库里面根据sql语句导出成excel

三、快速开始(不使用模板)

3.1 环境准备

添加ExcelCtr.dll引用,访问数据库时还需要DBUtil.dll

3.2 代码实现

3.2.1 将DatSet导出

DataSet ds = new DataSet();
//手动给ds填充数据
//...
//直接导出成文件
ExcelCtr.ExcelOP.Write("c:\\demo.xls", ds);

3.2.2 将dataset导出具有表格头和合并列的excel

DataSet ds = new DataSet();
//手动给ds填充数据
//...
//直接导出成文件,两个sheet的第一行都有一个标题(不是列标题,列标题手动修改每个datatable的datacolumn的name属性),并且两个sheet的第1和第2列都参数合并
ExcelCtr.ExcelOP.Write("c:\\年度收支统计.xls", ds, new List<string>() { "2016年收支统计", "2015年收支统计" }, new List<string>() { "1,2", "1,2" });

四、使用模板导出excel

4.1 使用方法

(1) 要准备一个xml文件和一个同名的xls文件,比如准备使用模板c:\\demo.xls作为导出的控制项,那么在要有c:\\demo.xml文件来对导出进行配置。
(2) 可以向模板中传递参数,使用Hashtable
(3) 代码使用

ExcelCtr.ExcelOP.WriteWithTemplate(new Hashtable(), "c:\\demo.xml", "c:\\年度收支统计.xls");

4.2 仅使用xml配置文件实现dataset导出(包括sheet标题和列合并功能)

4.2.1 简单导出(无列合并和sheet标题)

(1) Xml配置文件书写为”c:\\demo.xml”

<?xml version="1.0" encoding="utf-8" ?>
<WorkBook version="1.0"> <!--定义参数-->
<parameters>
<parameter name="ds" receive="ds" type="System.Data.DataSet" />
</parameters> 
<!--快速导出-->
<fastsheets useds="parameters.ds" />
</WorkBook>

(2) 代码调用

Hashtable ht = new Hashtable();
DataSet ds = new DataSet();
//手动给ds填充数据
//...
//将dataset传递给模板使用
ht.Add("ds", ds);
ExcelCtr.ExcelOP.WriteWithTemplate(ht, "c:\\demo.xml", "c:\\年度收支统计.xls");

4.2.2 导出dataset带列合并和sheet标题

(1) xml配置文件书写为”c:\\demo.xml”

<?xml version="1.0" encoding="utf-8" ?>
<WorkBook version="1.0">
<!--快速带参数导出-->
<fastsheets>
<fastsheet usedt="parameters.Person" name="人员表">
<!--如果有title就写在第一行最上面-->
<title value="人员信息表" />
</fastsheet>
<fastsheet usedt="parameters.TJ">
<!--如果有title就写在第一行最上面-->
<title value="年度统计表" />
<combinecolindexs value="A,B" />
</fastsheet>
</fastsheets>
</WorkBook>

(2) 代码调用

Hashtable ht = new Hashtable();
DataTable dt = new DataTable();
DataTable dt2 = new DataTable();
//手动给dt,dt2填充数据
//...
//将两个datatable传递给模板使用
ht.Add("Person", dt);
ht.Add("TJ", dt2);
ExcelCtr.ExcelOP.WriteWithTemplate(ht, "c:\\demo.xml", "c:\\年度收支统计.xls");

4.3 从数据库中去数据和从参数去数据导入到具体sheet中

(1) xml配置文件书写为”c:\\demo.xml”

<?xml version="1.0" encoding="utf-8" ?>
<WorkBook version="20161017">
  <!--定义参数-->
  <parameters>
    <!--默认参数-->
    <!--用户姓名-->
    <parameter name="uname" receive="uname" type="System.String" />
    <!--用户ID-->
    <parameter name="uid" receive="uid" type="System.String" />
    <!--当前日期如:2016-10-23-->
    <parameter name="date" receive="date" type="System.String" />
    <!--当前日期2如:2016年10月23日-->
    <parameter name="date2" receive="date2" type="System.String" />
    <!--当前日期3如:二零一六年十月二十三日-->
    <parameter name="date3" receive="date3" type="System.String" />
    <!--当前日期4如:2016年10月-->
    <parameter name="date4" receive="date4" type="System.String" />
    <!--当前日期5如:二零一六年十月-->
    <parameter name="date5" receive="date5" type="System.String" />
    <!--当前时间如:2016-10-23 13:58:23-->
    <parameter name="datetime" receive="datetime" type="System.String" />
    <!--当前时间2如:2016年10月23日 13时58分23秒-->
    <parameter name="datetime2" receive="datetime2" type="System.String" />
    <!--其他参数-->
    <parameter name="id" receive="id" type="System.String" />
    <parameter name="ordercol" receive="ordercol" type="System.String" />
  </parameters>

  <!--定义数据库访问对象-->
  <idbs>
    <idb name="default">
      <connstr value="Data Source=.;Initial Catalog=JACKOA;User ID=sa;Password=sa;" />
      <dbtype value="SQLSERVER" />
    </idb>
  </idbs>

  <!--定义计算项-->
  <calitems>
    <calitem name="XMMC">
      <sqltmp>
        <![CDATA[select top 1 XMMC from ZJBF where ID0='{0}']]>
      </sqltmp>
      <useidb value="idbs.default" />
      <usepara value="parameters.id" />
    </calitem>
    <calitem name="ZDWZ">
      <sqltmp>
        <![CDATA[select top 1 ZDWZ from ZJBF where ID0='{0}']]>
      </sqltmp>
      <useidb value="idbs.default" />
      <usepara value="parameters.id" />
    </calitem>
    <calitem name="BCJE">
      <sqltmp>
        <![CDATA[select top 1 BCJE from ZJBF where ID0='{0}']]>
      </sqltmp>
      <useidb value="idbs.default" />
      <usepara value="parameters.id" />
    </calitem>
  </calitems>

  <!--定义计算结果表-->
  <caldts>
    <caldt name="TJ">
      <sqltmp>
        <![CDATA[select top 1 * from TJ order by {0} asc]]>
      </sqltmp>
      <useidb value="idbs.default" />
      <usepara value="parameters.ordercol" />
    </caldt>
  </caldts>

  <!--使用打印模板-->
  <sheets>
    <sheet name="Sheet1">
      <rowmass>
        <row model="single" position="absolute" index="2">
          <coltmp index="B" value="#parameters.id#" />
        </row>
        <row model="single" position="absolute" index="3">
          <coltmp index="B" value="#calitems.XMMC#【#parameters.date2#】" />
        </row>
        <row model="single" position="absolute" index="4">
          <coltmp index="B" value="#calitems.ZDWZ#" />
        </row>
        <row model="single" position="absolute" index="5">
          <coltmp index="B" value="#calitems.BCJE#" />
        </row>
        <row model="single" position="absolute" index="6">
          <coltmp index="B" value="#parameters.uname#" />
          <coltmp index="G" value="#parameters.date2#" />
        </row>
      </rowmass>
      <pic>
        <from model="QRCode" value="项目【#calitems.XMMC#】补偿金额【#calitems.BCJE#】" QRSize="100" />
        <stretch model="original_size">
          <start col="G" row="8" offx="0" offy="0" />
        </stretch>
      </pic>
    </sheet>
    <sheet name="Sheet2">
      <rowmass>
        <row model="cycle" binddt="caldts.TJ" position="absolute" index="3">
          <coltmp index="A" value="#binddt.NianDu#" mergekey="#binddt.NianDu#" />
          <coltmp index="B" value="#binddt.YueFen#月" />
          <coltmp index="C" value="#binddt.ChengBen#" mergekey="#binddt.YueFen##binddt.ChengBen#" />
          <coltmp index="D" value="#binddt.ShouLiang#" />
          <coltmp index="E" value="#binddt.JingZhuan#" />
        </row>
        <row model="single" position="relative" index="1">
          <coltmp index="B" value="#parameters.uname#" />
          <coltmp index="E" value="#parameters.datetime#" />
        </row>
      </rowmass>
    </sheet>
  </sheets>
</WorkBook>
 

(2) 模板文件demo.xls


 

(3) 代码调用

Hashtable ht = new Hashtable();
ht.Add("uname", "胡庆杰");
ht.Add("uid", "3");
ht.Add("date", DateTime.Now.ToString("yyyy-MM-dd"));
ht.Add("date2", DateTime.Now.ToString("yyyy年MM月dd日"));
ht.Add("date3", "二零一六年十月二十三日");
ht.Add("date4", DateTime.Now.ToString("yyyy年MM月"));
ht.Add("date5", DateTime.Now.ToString("二零一六年十月"));
ht.Add("datetime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
ht.Add("datetime2", DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒"));
ht.Add("id", 1);
ht.Add("ordercol", "ID0");
ExcelOP.WriteWithTemplate(ht, "c:\\demo.xml", "c:\\out.xls");

五、模板配置说明

5.1 概述

模板的配置顶点是WorkBook下面是5类节点parametersidbscalitemscaldtssheets

5.2 parameters

这个节点是声明由调用代码传递进来的参数,其下面可以有多个parameter节点,parameter节点的name属性是在模板中使用的名字, receive属性是由调用代码传递进来的名字,type属性是参数类型(暂时没用可忽略),注意可以不声明仍可使用传递进来的参数。
这里的参数可以在下面的节点的属性值中使用,引用格式为#parameters.name #parameters.name,直接将它嵌入引用的位置即可。

5.3 idbs

这个节点是用来声明模板中访问数据库的连接的。可以同时访问多个数据库,每个要访问的数据库对应一个idb子节点 ,每个idb有一个属性name、两个节点(connstrdbtype),name属性作为下面查询的引用,connstr、dbtype分别作为连接的字符串和连接类型。

5.4 calitems

这个节点是用来定义从数据库中查询单个值的,每个查询对应一个calitem子节点。每个calitem有一个name属性(被引用的标识)和三类子节点sqltmpuseidbusepara,sqltmp节点的内容作为查询语句的模板,useidb表示要使用的连接,直接以idbs.name表示即可,usepara标识要使用的参数(按顺序可以有多个),直接以parameters.id表示即可。

5.5 caldts

这个节点表示从数据库中查询出来的表。用法类似于calitems。

5.6 sheets

这个节点表示excel模板中的Sheets集合,子节点sheet按照name属性与excel中的Sheet对应。

sheet节点可以有子节点rowmass(表示一堆按顺序的行,注意:只能有一个rowmass节点)、pic(表示输出的图片)。

5.6.1 输出行:

Sheet节点下的rowmass子节点下包含一堆按顺序输出的行(row节点)。

row节点的model属性表示这个模板行的类型(single表示这是一个简单的行,cycle表示这是一个循环行) ,position属性表示这个模板行引用的excel中的位置的计算方式(absolute表示绝对计算方式,relative表示相对计算方式)。

绝对计算方式就是根据index属性的值直接定位到excel中Sheet的行,而相对计算方式则是在上一个模板行的基础上加上index属性值得到xls中sheet行的。

对于model属性为cycle的row,它的属性binddt表示这个循环行要使用哪个表来循环(可以引用传递进来的参数或模板中配置的查询表)。
row节点下是子节点coltmp,coltmp的属性index表示列索引,value属性表示这个列的值(可以引用传递进来的参数和模板中配置的计算项,以#calitems.name#方式嵌入即可,如果当前行是循环行则还可以使用#binddt.NianDu#方式引用当前行所绑定到的表的某一列),mergekey属性代表这一列的合并标志(没有这一属性就不参数合并),这个合并标志会计算出结果后比较相同则把相邻的两行进行合并。

5.6.2 输出图片

Sheet节点下的pic子节点表示输出项为图片。

pic节点下的from子节点表示输出图片的来源(目前支持:“QRCode”/“File”,前者表示二维码,后者表示本地图片)。

pic节点下的stretch子节点表示输出的图片的位置及拉伸信息。它有modelwidthheight三个属性。

model属性表示拉伸的类型,取值为:rationone,当为ratio时表示按比例拉伸,此时width和height属性只能有一个(width优先);当为none时表示不按照比例,此时width和height都可以设置。

注意:也可以不设置model属性,表示不进行拉伸。

from节点的value属性值表示的是二维码承载的字符串信息或图片的绝对路径。

from节点的QRSize属性表示的是二维码的尺寸(当输出为二维码时有效)。

pic节点下的stretch下的start节点表示图片的位置信息,colrow属性分别表示图片位置参照的单元格的索引,offxoffy属性表示图片的左上角偏离参照单元格左上角的大小。

### 回答1: WPF是一种用于开发桌面应用程序的技术,而NPOI是一个用于处理Excel文件的开源库。通过结合使用WPF和NPOI,我们可以在WPF应用程序中实现Excel文件的导入导出功能。 要使用NPOI导入Excel文件,首先需要引入NPOI库。我们可以通过NuGet包管理器将NPOI库添加到我们的WPF项目中。然后,我们可以使用NPOI的API来读取和解析Excel文件。我们需要创建一个Workbook对象,并选择要读取的特定Sheet,然后使用循环遍历每一行,并读取每个单元格的值。 在WPF中,我们可以创建一个界面并添加一个按钮,用于触发Excel文件导入功能。当用户点击按钮时,我们将使用NPOI库打开文件选择对话框,允许用户选择要导入Excel文件。一旦我们获取了用户选择的文件路径,我们可以使用NPOI的API来读取Excel文件,然后将数据绑定到WPF应用程序中的相应控件上。 要使用NPOI导出Excel文件,在WPF中,我们可以将数据绑定到DataGrid或ListView等控件上。当用户点击导出按钮时,我们可以使用NPOI的API来创建一个Workbook对象,并选择要导出的Sheet。然后,我们可以使用循环遍历来将数据从WPF控件中导出Excel文件的每一行。 最后,我们可以将导出Excel文件保存到硬盘上的特定路径。使用NPOI的API,我们可以设置导出文件的格式和样式,例如设置单元格的字体、颜色、边框等。 总之,通过使用NPOI库,我们可以在WPF应用程序中实现Excel文件的导入导出功能。这个过程涉及到引入NPOI库、读取和解析Excel文件、将数据绑定到WPF控件上、使用NPOI导出数据到Excel文件等步骤。 ### 回答2: WPF是一种用于构建Windows应用程序的开发框架,而NPOI是一个支持读取和写入Microsoft Office格式文件的库。使用NPOI库可以在WPF应用程序中实现Excel文件的导入导出功能。 首先需要在WPF项目中引用NPOI库,可以通过NuGet包管理器或手动引用DLL文件的方式进行添加。 要导入Excel文件,我们可以使用NPOI库提供的类来读取和解析文件。首先需要创建一个ExcelWorkbook对象,然后通过获取工作表和行、单元格的方式来获取数据。可以使用循环遍历的方法将数据导入到WPF应用程序中的数据结构中,如数据表或集合。 要导出Excel文件,我们可以使用NPOI库提供的类来创建和写入Excel文件。首先需要创建一个ExcelWorkbook对象,然后创建工作表和行对象,并将数据写入到单元格中。最后,可以使用流将Excel文件保存到指定的位置。 需要注意的是,导入导出Excel文件时需要处理一些异常情况,如文件格式错误、IO异常等,可以使用try-catch语句来捕获并处理这些异常。 总结来说,使用NPOI库可以方便地在WPF应用程序中实现Excel文件的导入导出功能。通过引用NPOI库,并使用它提供的类和方法,我们可以读取和解析Excel文件的数据,以及创建和写入Excel文件。这使得我们可以更加灵活和高效地处理Excel文件,满足特定的需求。 ### 回答3: WPF是一种使用XAML语言和.NET框架开发桌面应用程序的技术。NPOI是一个用于操作Microsoft Office格式文件的开源库,可以在WPF应用程序中使用NPOI来实现Excel文件的导入导出。 在使用NPOI导入Excel文件时,首先需要引入NPOI的相关命名空间,然后通过创建一个Workbook对象来加载Excel文件。可以使用Workbook的GetSheetAt方法获取具体的工作表,并通过遍历行和列的方式获取单元格的数据。再通过将数据存储到一个集合或数据表中,便可以在WPF应用程序中进行进一步的处理和展示。 在使用NPOI导出Excel文件时,首先需要创建一个Workbook对象,并在其中创建一个工作表。然后通过遍历数据集合或数据表,使用NPOI提供的方法在工作表中添加行和列,并设置相应的单元格数值。最后,使用Workbook的Write方法将数据写入到Excel文件中,并通过保存文件的方式实现导出功能。 此外,还可以根据需求设置单元格的样式、字体、颜色等属性,以及合并单元格、设置边框等操作。通过熟悉NPOI库的API文档,可以灵活地操作Excel文件,并在WPF应用程序中实现导入导出Excel的功能。 总之,通过使用NPOI库,可以在WPF应用程序中方便地实现Excel文件的导入导出功能,提高了应用程序的灵活性和用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackletter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值