`
380071587
  • 浏览: 440588 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Excel模板导出(针对复杂报表的一种解决方式)

 
阅读更多

比如需导出如下形式的报表:


里面数据字段分类很多,又含公式统计等情况。

解决方案:利用NPOI组件,制作导出模板,对单元格精确控制,通过读取单元格里的模板字段,进行数据匹配替换;模板形式如下:


核心方法

    /// <summary>
        /// 根据Excel模板单元格内容,找出单元格,并设置单元格的值
        /// </summary>
        /// <param name="sheet">ExcelSheet</param>
        /// <param name="rowIndex">行索引</param>
        /// <param name="cellTemplateValue">模板内容</param>
        /// <param name="cellFillValue">单元格值</param>
        ///  <param name="conNextRow">是否承接下一行,即:填充下一行单元格模板内容</param>
        public static void SetCellValueByTemplateStr(HSSFSheet sheet, int rowIndex, string cellTemplateValue, object cellFillValue, bool conNextRow = true)
        {
            int cellStartIndex = sheet.GetRow(rowIndex).FirstCellNum;
            int cellEndIndex = sheet.GetRow(rowIndex).LastCellNum;
            bool find = false;
            for (int i = cellStartIndex; i < cellEndIndex; i++)
            {
                if (find)
                    break;
                else
                    if (i < (cellEndIndex - cellStartIndex) / 2)
                    {
                        #region 折半查找:前半段
                        for (int j = i; j < (cellEndIndex - cellStartIndex) / 2; j++)
                        {
                            if (find)
                                break;
                            else
                            {
                                HSSFCell cell = sheet.GetRow(rowIndex).GetCell(j);
                                if (cell != null)
                                {
                                    if (cell.CellType == 1)
                                    {
                                        string strCellValue = sheet.GetRow(rowIndex).GetCell(j).StringCellValue;
                                        if (string.Compare(strCellValue, cellTemplateValue, true) == 0)
                                        {
                                            find = true;
                                            Type type = cellFillValue.GetType();
                                            switch (type.ToString())
                                            {
                                                case "System.String":
                                                    string strValue = cellFillValue.ToString();
                                                    sheet.GetRow(rowIndex).GetCell(j).SetCellValue(strValue);
                                                    break;
                                                case "System.Int32":
                                                    int intValue = Convert.ToInt32(cellFillValue.ToString());
                                                    sheet.GetRow(rowIndex).GetCell(j).SetCellValue(intValue);
                                                    break;
                                                case "System.Decimal":
                                                    double decimalValue = Convert.ToDouble(cellFillValue.ToString());
                                                    sheet.GetRow(rowIndex).GetCell(j).SetCellValue(decimalValue);
                                                    break;
                                            }
                                            if (conNextRow)//如果承接下一行,则设置下一行单元格里的模板内容
                                            {
                                                sheet.GetRow(rowIndex + 1).GetCell(j).SetCellValue(cellTemplateValue);
                                                sheet.GetRow(rowIndex + 1).GetCell(j).SetCellType(1);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        #endregion
                    }
                    else
                    {
                        #region 折半查找:后半段
                        for (int j = (cellEndIndex - cellStartIndex) / 2; j < cellEndIndex; j++)
                        {
                            if (find)
                                break;
                            else
                            {
                                HSSFCell cell = sheet.GetRow(rowIndex).GetCell(j);
                                if (cell != null)
                                {
                                    if (cell.CellType == 1)
                                    {
                                        string strCellValue = sheet.GetRow(rowIndex).GetCell(j).StringCellValue;
                                        if (string.Compare(strCellValue, cellTemplateValue, true) == 0)
                                        {
                                            find = true;
                                            Type type = cellFillValue.GetType();
                                            switch (type.ToString())
                                            {
                                                case "System.String":
                                                    string strValue = cellFillValue.ToString();
                                                    sheet.GetRow(rowIndex).GetCell(j).SetCellValue(strValue);
                                                    break;
                                                case "System.Int32":
                                                    int intValue = Convert.ToInt32(cellFillValue.ToString());
                                                    sheet.GetRow(rowIndex).GetCell(j).SetCellValue(intValue);
                                                    break;
                                                case "System.Decimal":
                                                    double decimalValue = Convert.ToDouble(cellFillValue.ToString());
                                                    sheet.GetRow(rowIndex).GetCell(j).SetCellValue(decimalValue);
                                                    break;
                                            }
                                            if (conNextRow)//如果承接下一行,则设置下一行单元格里的模板内容
                                            {
                                                sheet.GetRow(rowIndex + 1).GetCell(j).SetCellValue(cellTemplateValue);
                                                sheet.GetRow(rowIndex + 1).GetCell(j).SetCellType(1);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        #endregion
                    }
            }
        }
Demo 下载

分享到:
评论

相关推荐

    Java导出Word文档的实现.docx

    第一种方式操作简单,但也只能生成简单的Word文档,无法生成有表格的Word文档; 第二种方式可以生成复杂的Word文档,但是还要进行Word转xml,xml转ftl的双重转换,不适合内容经常变更的Word文档; 第三种方式有...

    JimuReport - 积木报表(一款免费Web报表工具)

    一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等! Web 版报表设计器,类似于excel操作风格,通过拖拽完成报表设计。 秉承“简单、...

    ExcelQuicker 报表最佳解决方案

    ExcelQuicker 2.0正式版作者:EungeMSN: eudev.net@yeah...提供了对模板化编程的极力支持,比如在EQTable类的IsInsertMode属性就支持将批量数据导出到Excel模板文档中的一行;对.NET下的所有编程语言都提供支持;……

    锐浪报表Grid++Report5.3

    4、独有的报表查询显示功能:提供报表查询与输出的集成一次性实现,保证数据不同展现方式的一致性与完整性。 5、报表数据来源丰富:支持绑定(报表数据拉模式)与非绑定(报表数据推模式),一切数据库数据与其它数据都...

    Grid++Report5.6报表开发工具

    4、独有的报表查询显示功能:提供报表查询与输出的集成一次性实现,保证数据不同展现方式的一致性与完整性。 5、报表数据来源丰富:支持绑定(报表数据拉模式)与非绑定(报表数据推模式),一切数据库数据与其它数据都...

    Grid++Report5.5报表工具

    4、独有的报表查询显示功能:提供报表查询与输出的集成一次性实现,保证数据不同展现方式的一致性与完整性。 5、报表数据来源丰富:支持绑定(报表数据拉模式)与非绑定(报表数据推模式),一切数据库数据与其它数据都...

    Grid++Report6 报表开发者安装包

    4、独有的报表查询显示功能:提供报表查询与输出的集成一次性实现,保证数据不同展现方式的一致性与完整性。 5、报表数据来源丰富:支持绑定(报表数据拉模式)与非绑定(报表数据推模式),一切数据库数据与其它数据都...

    Grid++Report5报表工具 版本5.5.0.8

    4、独有的报表查询显示功能:提供报表查询与输出的集成一次性实现,保证数据不同展现方式的一致性与完整性。 5、报表数据来源丰富:支持绑定(报表数据拉模式)与非绑定(报表数据推模式),一切数据库数据与其它数据都...

    ACReport中国式报表控件2010(Ver2.25)

    四、 增加IAcFuncionLib接口支持,以一种新的方式扩充函数库【SDK】 五、 增加LoadFromStream和SaveToStream方法及IAcNetStream接口支持【SDK】 六、 修改了单元格批量复制粘帖功能,当粘帖位置行数不够时,粘帖时...

    ACReport中国式报表组件2010(Ver2.2)(含文档)

    四、 增加IAcFuncionLib接口支持,以一种新的方式扩充函数库【SDK】 五、 增加LoadFromStream和SaveToStream方法及IAcNetStream接口支持【SDK】 六、 修改了单元格批量复制粘帖功能,当粘帖位置行数不够时,粘帖时...

    Stimulsoft Reports.Net中文介绍

    您可以创建报表,显示报表,打印报表,导出报表。 Stimulsoft Reports.Web将提供完整的报表创建周期,从报表模板开始到在浏览器中显示报表为止。这一过程可在web浏览器未被关闭时完成。 Stimulsoft Reports.Web是第...

    勤哲excel服务器2010教程

    23.2.3 动态决定显示哪一种树型 396 23.2.4 新建表单 398 23.2.5 修改表单 399 23.2.6 其它程序员用VBA编程接口 400 第24章、 网盘 405 24.1 安装网络硬盘服务器 405 24.2 网盘配置 406 24.2.1 管理控制台中的设置 ...

    Excel2007图表完全剖析 6/8

     全书分为14章和一个附录,包括如下内容:学习使用Excel 2007图表制作界面,掌握使用图形有效地表示数据的方式,根据要传达的信息选择正确的图表类型,学习可节省时间的解决方案,创建大多数人认为使用Excel无法...

    soaoffice示例代码

    SOAOffice是一种中间件软件,不能直接给最终用户使用,需要软件编程人员将SOAOffice集成到软件系统中才能发挥它的威力。比较直观的来说,通常有以下需求的Web开发者推荐使用SOAOffice: 1. 需要把数据库字段内容填充...

    报价之星 v17.620.exe

    报价之星主要由企业内投标工程师、方案制作人员使用,自动生成word、excel、html等多种格式报表,以解决众多企业在投标报价、项目报价问题。软件不仅拥有其强大的计算功能,且已录入多种模板逻辑,不需要再自主制作...

    Excel2007图表完全剖析 3/8

     全书分为14章和一个附录,包括如下内容:学习使用Excel 2007图表制作界面,掌握使用图形有效地表示数据的方式,根据要传达的信息选择正确的图表类型,学习可节省时间的解决方案,创建大多数人认为使用Excel无法...

    StimulSoft_Reports.Net_2009.1.359破解+2009.1.400试用版_Part1

    导出23种格式,如PDF,RTF,Excel,EMF等。支持数据图报表。支持运行时设计。 1 特点 (1) 可以将报表模板便捷地分隔为多页 使用本产品,用户可以以可视化的方式方便地将报表模板分隔为多个页面。您可以可视化地输入您...

    StimulSoft_Reports.Net_2009.1.359破解+2009.1.400试用版_Part2

    导出23种格式,如PDF, RTF, Excel, EMF等。支持数据图报表。支持运行时设计。 1 特点 (1) 可以将报表模板便捷地分隔为多页 使用本产品,用户可以以可视化的方式方便地将报表模板分隔为多个页面。您可以可视化地...

    Excel2007图表完全剖析 8/8

     全书分为14章和一个附录,包括如下内容:学习使用Excel 2007图表制作界面,掌握使用图形有效地表示数据的方式,根据要传达的信息选择正确的图表类型,学习可节省时间的解决方案,创建大多数人认为使用Excel无法...

Global site tag (gtag.js) - Google Analytics