Excel多表头导出(.net)

分享一下以前做的.net版本的Excel多表头导出,其中使用了第三方插件NPOI (java推荐使用POI)。

demo下载

以下是算法部分:

  public static string ExportTable(ArrayList data, ArrayList columns)
    {

        ArrayList columnsBottom = getColumnsBottom(columns);

        ArrayList columnsTable = getColumnsTable(columns);

        StringBuilder sb = new StringBuilder();
        //data = ds.DataSetName + "\n";


        //data += tb.TableName + "\n";
        sb.AppendLine("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\">");
        sb.AppendLine("<table cellspacing=\"0\" cellpadding=\"5\" rules=\"all\" border=\"1\">");
        //写出列名

        for (int i = 0; i < columnsTable.Count; i++)
        {
            ArrayList columnsRow = (ArrayList)columnsTable[i];
            sb.AppendLine("<tr style=\"font-weight: bold; white-space: nowrap;\">");
            foreach (Hashtable column in columnsRow)
            {
                sb.AppendLine("<td colspan=" + column["colspan"] + " rowspan=" + column["rowspan"] + ">" + column["header"] + "</td>");
            }
            sb.AppendLine("</tr>");
        }
        //写出数据

        int count = 0;
        foreach (Hashtable row in data)
        {
            sb.Append("<tr>");
            foreach (Hashtable column in columnsBottom)
            {
                Object value;
                if (column["field"] != null)
                {
                    value = row[column["field"]];
                }
                else
                {
                    value = "";
                }
                if (Convert.ToString(column["type"]) == "indexcolumn") value = count + 1;
                sb.AppendLine("<td >" + value + "</td>");
            }
            sb.AppendLine("</tr>");
            count++;
        }
        sb.AppendLine("</table>");


        return sb.ToString();
    }

    public static ArrayList getColumnsBottom(ArrayList columns)
    {
        ArrayList columnsBottom = new ArrayList();

        for (int i = 0; i < columns.Count; i++)
        {
            Hashtable column = (Hashtable)columns[i];

            if (column["columns"] != null)
            {
                ArrayList childColumns = (ArrayList)column["columns"];
                columnsBottom.AddRange(getColumnsBottom(childColumns));
            }
            else
            {
                columnsBottom.Add(column);
            }

        }
        return columnsBottom;
    }

    public static ArrayList getColumnsTable(ArrayList columns)
    {
        ArrayList table = new ArrayList();

        getColumnsRows(columns, 0, table);

        createTableSpan(table);

        return table;

    }

    public static void getColumnsRows(ArrayList columns, int level, ArrayList table)
    {
        ArrayList row = null;
        if (table.Count > level)
        {
            row = (ArrayList)table[level];
        }
        else
        {
            row = new ArrayList();
            table.Add(row);
        }

        for (int i = 0; i < columns.Count; i++)
        {

            Hashtable column = (Hashtable)columns[i];
            ArrayList childColumns = (ArrayList)column["columns"];

            row.Add(column);

            if (childColumns != null)
            {

                getColumnsRows(childColumns, level + 1, table);
            }

        }
    }

    public static void createTableSpan(ArrayList table)
    {
        for (int i = 0; i < table.Count; i++)
        {
            ArrayList row = (ArrayList)table[i];  //row
            for (int l = 0; l < row.Count; l++)
            {
                Hashtable cell = (Hashtable)row[l];   //column

                int colSpan = getColSpan(cell);
                cell["colspan"] = colSpan;

                if (colSpan > 1)
                {
                    cell["rowspan"] = 1;
                }
                else
                {
                    cell["rowspan"] = table.Count - i;
                }

            }
        }
    }

    public static int getColSpan(Hashtable column)
    {
        int colSpan = 0;
        ArrayList childColumns = (ArrayList)column["columns"];
        if (childColumns != null)
        {
            for (int i = 0; i < childColumns.Count; i++)
            {
                Hashtable child = (Hashtable)childColumns[i];
                colSpan += getColSpan(child);
            }
        }
        else
        {
            colSpan = 1;
        }
        return colSpan;
    }

 

转载于:https://www.cnblogs.com/romayn/p/7275621.html

要在Java中实现Excel多级表头导出,你可以使用阿里巴巴的EasyExcel库。首先,你需要创建一个数据类,使用`@ExcelProperty`注解来指定每个字段对应的表头。例如,你可以创建一个名为`DemoData`的类,其中包含了多个字段和对应的表头。然后,你可以使用`ExcelWriter`类来创建一个Excel文件,并使用`write`方法将数据写入文件中。最后,你可以使用`finish`方法来关闭ExcelWriter并保存文件。 以下是一个示例代码,展示了如何使用EasyExcel实现多级表头导出: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.builder.ExcelWriterBuilder; import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; import com.alibaba.excel.write.metadata.WriteSheet; import java.util.ArrayList; import java.util.Date; import java.util.List; public class ExcelExportExample { public static void main(String\[\] args) { // 创建数据列表 List<DemoData> dataList = new ArrayList<>(); dataList.add(new DemoData(1, "一级", "二级", new Date(), 1.0)); dataList.add(new DemoData(2, "一级", "二级", new Date(), 2.0)); dataList.add(new DemoData(3, "一级", "二级", new Date(), 3.0)); // 创建ExcelWriter对象 ExcelWriterBuilder writerBuilder = EasyExcel.write("output.xlsx", DemoData.class); ExcelWriterSheetBuilder sheetBuilder = writerBuilder.sheet(); // 设置表头 sheetBuilder.head(createHead()); // 写入数据 WriteSheet sheet = sheetBuilder.build(); writerBuilder.build().write(dataList, sheet); // 关闭ExcelWriter writerBuilder.build().finish(); } // 创建表头 private static List<List<String>> createHead() { List<List<String>> head = new ArrayList<>(); List<String> firstLevel = new ArrayList<>(); firstLevel.add("一级"); List<String> secondLevel = new ArrayList<>(); secondLevel.add("二级"); List<String> thirdLevel = new ArrayList<>(); thirdLevel.add("三级"); List<String> fourthLevel = new ArrayList<>(); fourthLevel.add("四级"); head.add(firstLevel); head.add(secondLevel); head.add(thirdLevel); head.add(fourthLevel); return head; } } ``` 在上面的示例中,我们创建了一个`DemoData`类来表示数据,然后使用`ExcelWriter`和`ExcelWriterSheetBuilder`来创建Excel文件和工作表。我们还使用`createHead`方法创建了多级表头。最后,我们将数据写入Excel文件并保存。 请确保在项目的`pom.xml`文件中添加EasyExcel的依赖项: ```xml <!-- 操作excel --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.1</version> </dependency> ``` 希望这个示例能帮助到你实现Java中的多级表头导出。如果你需要更多的帮助,请参考EasyExcel的官方文档\[2\]和相关博客\[3\]。 #### 引用[.reference_title] - *1* *3* [java 导出excel 创建多级表头 Easyexcel web下载](https://blog.csdn.net/weixin_51216079/article/details/119782920)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Java生成Excel自定义导出合并(多级表头)](https://blog.csdn.net/javaFhx/article/details/124480453)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值