`
380071587
  • 浏览: 478336 次
  • 性别: 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 下载

分享到:
评论

相关推荐

    Excel报表导出,复杂Excel模板导出(带单元格合并),jxls2

    总结起来,这个项目通过`jxls2`库提供了一种高效、灵活的Excel报表导出解决方案,支持单元格合并和复杂的模板设计,能够满足多样化的需求,对于提升企业级应用的数据处理能力有着显著的作用。开发者只需花费较少的...

    Excel模板导出(针对复杂模板情况)

    在IT行业中,Excel模板导出是一项常见的数据处理任务,尤其在面对复杂模板情况时,它显得尤为重要。这种技术主要用于批量生成或更新具有统一格式的Excel文件,例如财务报告、销售统计或是数据分析等场景。下面我们将...

    easyPoi模板导出Excel报表(xls 和xlsx 都支持)

    1. **模板设计**:首先,我们需要设计一个Excel模板,模板中包含了报表的结构、样式和占位符。这些占位符是动态的,将在运行时被实际数据替换。例如,我们可以用`${name}`表示姓名字段,`${age}`表示年龄字段等。 2...

    jeecg Excel通过模板导出

    在Jeecg中,Excel模板导出功能是其报表模块的一个重要组成部分。 在实现"Jeecg Excel通过模板导出"时,首先你需要创建一个Excel模板。这个模板可以包含各种预定义的样式,如字体、颜色、边框、对齐方式、公式等。...

    C# 导出利用模板,映射文件导出复杂excel

    在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用、Web应用以及游戏等领域。本主题聚焦于如何使用C#来实现一个复杂的Excel导出功能,结合模板和映射文件,以及可能涉及的操作Excel宏。这个过程...

    使用JXLS+Excel模板制作灵活的excel导出

    总结来说,JXLS结合Excel模板是一种高效且灵活的Java Excel导出解决方案。它通过模板和数据映射的方式,降低了开发复杂度,提升了代码的可维护性。通过熟悉和掌握JXLS,开发者能够轻松应对各种复杂的Excel生成需求,...

    Excel导出数据(根据Excel模板定义)

    "Excel导出数据(根据Excel模板定义)"这个主题涉及到的核心技术是如何根据预设的Excel模板生成和导出数据,通常用于批量生成报表或者进行复杂的数据呈现。下面将详细解释这一过程及其相关知识点。 1. **Excel模板...

    NPOI基于模板导出到excel

    在基于模板导出Excel的过程中,开发者通常会先创建一个包含固定格式和占位符的Excel模板文件。模板中可能包含了各种样式设置,如字体、颜色、边框、合并单元格等,以及一些预定义的公式。然后,通过NPOI库,开发者...

    基于spring的以excel模板的导入导出

    当涉及到数据导入导出时,Spring提供了一种高效且灵活的方式,特别是在处理Excel数据时。本篇文章将深入探讨如何基于Spring实现基于Excel模板的导入导出功能。 首先,我们来理解“基于excel模板的导入导出”这个...

    使用EasyPOI导出Excel模板数据(含图片)博文源码

    这篇博文的源码提供了一个使用EasyPOI导出包含图片的Excel模板数据的示例,这在报表生成、数据分析和报告制作等场景中非常实用。 首先,我们来看看`ExcelTemplateExportUtil.java`,这个类是导出工具的核心,它实现...

    jxls使用模板实现导出excel!

    它引入了一种基于模板的方法,使得动态创建和更新Excel文件变得简单,类似于我们在HTML和JSP中使用JSTL标签的方式。 2. **Apache POI简介**: Apache POI是Apache软件基金会的一个开源项目,提供了API来读写...

    JSP运用模板导出Excel

    本文档主要介绍了使用 JSP 和 jxls 库来实现 Excel 文件的导出,针对 eMan 系统中普遍使用的导出 Excel 的方法 JXL 的缺陷,引入了一种新的方法来解决大规模报表的导出问题。 1. 背景 在 eMan 系统的开发过程中...

    基于POI+XML配置模板Excel导出

    总的来说,"基于POI+XML配置模板Excel导出"是一种高效的Excel导出策略,它利用了POI的强大功能和XML模板的灵活性,使得在Java应用中生成格式化的Excel文件变得更加便捷。对于需要处理大量数据报表的项目,这样的解决...

    java excel大数据量导出demo,可支持模板导出

    1. **模板导出**:用户可以预先定义Excel模板,包括单元格格式、样式、公式等。在导出数据时,根据模板填充数据,确保导出的Excel与预期的样式一致。这通常涉及到HSSFCell和XSSFCell对象的使用,它们代表Excel中的...

    NPOI按模板导出C#环境

    在“按模板导出”这个场景下,模板通常包含了预设的格式、样式和计算公式,开发者只需要根据数据填充模板即可快速生成报表。 以下是使用NPOI按模板导出Excel的步骤: 1. **安装NPOI库**:在你的C#项目中,可以通过...

    Aspose无需模板导出Excel带Chart

    总的来说,Aspose.Cells库提供了一种高效、灵活的方式来处理Excel文档,特别是对于需要在程序中动态生成带有图表的报表时,它是一个非常实用的工具。结合C#编程语言,开发者可以轻松实现这一目标,无需依赖Microsoft...

    C#版本Itextsharp根据模板导出pdf报表

    在这个场景下,我们将深入探讨如何使用C#和Itextsharp库根据模板导出PDF报表。 首先,我们需要理解模板的概念。模板通常是一个预定义的PDF文件,包含固定的布局和样式,而实际的数据将被插入到这些预定的位置。在...

    excel导出模板控件

    Excel导出模板控件是一种基于NPOI库的高级功能,它使得开发人员能够在Web应用程序中轻松地生成和导出Excel文件,而无需用户在本地计算机上安装Microsoft Office。NPOI是一个开源的.NET库,它允许程序员读取、写入和...

    以模板导出的Excel源码

    在IT行业中,Excel是一种广泛使用的数据处理和分析工具,尤其在数据分析、报表制作以及数据可视化等领域。"以模板导出的Excel源码"这个主题主要关注如何通过编程方式利用模板来自动化生成Excel文件。通常,这涉及到...

    帆软报表导出各种格式(excel/word/pdf等)

    帆软报表提供了一种灵活的方式,可以将设计好的报表导出为Excel格式。这通常涉及到报表查询、数据填充以及格式转换。用户可以通过API调用或报表设计器中的导出选项来实现这一功能。导出的Excel文件可以保持报表原有...

Global site tag (gtag.js) - Google Analytics