首页 新闻 会员 周边 捐助

.net导出到Excel固定模版中

0
悬赏园豆:100 [已解决问题] 解决于 2012-11-29 10:51

各位大侠小弟最近遇到一点问题 麻烦各位大侠帮帮忙  

现在公司做了一个固定Excel模版  需要从数据库读取数据导入到固定Execl模版中去  列头大概有一百个字段  麻烦那位大侠能提供源代码 

小易哥的主页 小易哥 | 初学一级 | 园豆:112
提问于:2012-11-07 22:06
< >
分享
最佳答案
0

添加NPOI的引用,主意一点的是,ForceFormulaRecalculation是强制要求Excel在打开时重新计算的属性,示例代码如下:

FileStream file = new FileStream(@"template/book1.xls", FileMode.Open,FileAccess.Read);

HSSFWorkbook hssfworkbook = new HSSFWorkbook(file);
HSSFSheet sheet1 = hssfworkbook.GetSheet("Sheet1");
sheet1.GetRow(1).GetCell(1).SetCellValue(200200);
sheet1.GetRow(2).GetCell(1).SetCellValue(300);
sheet1.GetRow(3).GetCell(1).SetCellValue(500050);
sheet1.GetRow(4).GetCell(1).SetCellValue(8000);
sheet1.GetRow(5).GetCell(1).SetCellValue(110);
sheet1.GetRow(6).GetCell(1).SetCellValue(100);
sheet1.GetRow(7).GetCell(1).SetCellValue(200);
sheet1.GetRow(8).GetCell(1).SetCellValue(210);
sheet1.GetRow(9).GetCell(1).SetCellValue(2300);
sheet1.GetRow(10).GetCell(1).SetCellValue(240);
sheet1.GetRow(11).GetCell(1).SetCellValue(180123);
sheet1.GetRow(12).GetCell(1).SetCellValue(150);

//Force excel to recalculate all the formula while open

sheet1.ForceFormulaRecalculation = true;

FileStream file = new FileStream(@"test.xls", FileMode.Create);
hssfworkbook.Write(file);
file.Close();
收获园豆:40
MasterWei | 菜鸟二级 |园豆:223 | 2012-11-07 22:51
其他回答(4)
0

用NPOI吧,具体用法你网上找下,源码明天去公司才有。。。

收获园豆:10
向往-SONG | 园豆:4853 (老鸟四级) | 2012-11-07 22:15

明天可以给我看一下源码吗  跪求

支持(0) 反对(0) 小易哥 | 园豆:112 (初学一级) | 2012-11-07 22:16

@小易哥: npoi.codeplex.com  下载下来里面就有的。 

支持(0) 反对(0) sym_cn | 园豆:798 (小虾三级) | 2012-11-08 09:37

@小易哥: 

楼下已经给了示例,就那样直接拿过去用就是了。

支持(0) 反对(0) 向往-SONG | 园豆:4853 (老鸟四级) | 2012-11-08 09:39
0

方法不错,可以学习一下

jason2013 | 园豆:1998 (小虾三级) | 2012-11-08 13:20
0
收获园豆:10
只会造轮子 | 园豆:2274 (老鸟四级) | 2012-11-08 16:09
0

100多列,要是像上面的代码一样一一列出来,会搞死的,不管是使用Npoi 还是 MS Excel。如果顺序有变怎么办?如果字段有增减怎么办?建议搞一个配置文件,配置那个字段对应哪列。根据配置来输出就可以了。

收获园豆:40
不辞远 | 园豆:290 (菜鸟二级) | 2012-11-09 17:27

我不怎么会用XML  那位大侠可以指点一二不  跪求源代码

支持(1) 反对(0) 小易哥 | 园豆:112 (初学一级) | 2012-11-09 18:16

@小易哥: 如果对XML操作不熟悉,其实也可以在数据库建立一张字典表啊,假设你针对你的模版建立如下的字典表:

那如下就是在Web上根据模版生成Excel的函数:

  Function ExportDataToExcel(ByVal mPage As Page) As String

        Dim xls As Excel.Application
        xls = New Excel.Application

        '保存的名称和路径
        Dim filePath As String = "downfile/建设用地统计报表" & "_" & GetFileNow() & ".xls"

        Dim ds, ds_dict As DataSet
        Dim dr, dr_dict As DataRow

        Try
            Dim i As Long
            Dim j As Long
            Dim rowId As Long 'Excel中行id

            xls.Workbooks.Open(mPage.MapPath("template/建设用地统计报表.xls"))  '打开模版
            xls.ActiveWorkbook.SaveAs(mPage.MapPath(filePath))                  '保存到想保存的路径
            xls.ActiveWorkbook.Sheets("一览表").Select()                        '选中即将要输出数据的sheet

            ds_dict = mconn.ExecuteGet("select * from t_export_dict order by id") '参数表
            ds = mconn.ExecuteGet("select * from t_gdxm order by qd_rq desc")  '数据表

            rowId = 2  '从第二行开始输出
            For i = 0 To ds.Tables(0).Rows.Count - 1
                dr = ds.Tables(0).Rows(i)

                For j = 0 To ds_dict.Tables(0).Rows.Count - 1
                    dr_dict = ds_dict.Tables(0).Rows(j)
                    'xls.Range("A1").Value = "合同编号" '在excel中可以通过 xls.Range("A1").Value="abc" 的方式给 A列第1行 的单元格赋值
                    xls.Range(dr_dict.Item("excel_col_name").ToString() & rowId.ToString()).Value = dr.Item(dr_dict.Item("field_name").ToString()).ToString
                Next

                rowId += 1 '移动到Excel下一行
            Next

            xls.Range("A1").Select() '重新选择第一个单元格
            xls.ActiveWorkbook.Save() '保存
        Catch ex As Exception
        Finally
            xls.Quit()
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xls)
            xls = Nothing
            System.GC.Collect()
        End Try

        Return filePath
    End Function

 

如此在数据库中配好列对应的字段即可。

需要添加 ms office library的引用。

支持(0) 反对(0) 不辞远 | 园豆:290 (菜鸟二级) | 2012-11-09 23:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册