C# 导出为二维表头的EXCEL

#include "StdAfx.h"
#include "ExportData.h"
using namespace System::Windows ::Forms ;
using namespace TDLTESYSTEM;
ExportData::ExportData(DataTable^ dt,String^ filename,String^ title)
{
this->dt=dt;
this->filename =filename;
this->title =title;
ExportToExcel(dt,filename,title);
}
int ExportData::ExportToExcel(DataTable^ dt,String^ filename,String^ title)
{
 try
    {
        int sheetRows = 65535;//设置Sheet的行数,此为最大上限,本来是65536,因表头要占去一行
        int sheetCount = (dt->Rows->Count - 1) / sheetRows + 1;//计算Sheet数
  System::GC::Collect();//垃圾回收

  Excel::Application^ excel;
  Excel::Workbook^ xBk;
  Excel::Worksheet^ xSt = nullptr;
  excel = gcnew Excel::ApplicationClass();
  xBk = excel->Workbooks->Add(true);
  //Excel::_Worksheet ^ss;
  
  //ss->GetType();
        //定义循环中要使用的变量
        int dvRowStart;
        int dvRowEnd;
        int rowIndex = 0;
        int colIndex = 0;
        //对全部Sheet进行操作
        for (int sheetIndex = 0; sheetIndex < sheetCount; sheetIndex++)
        {
            //初始化Sheet中的变量
            rowIndex = 1;
            colIndex = 1;
            //计算起始行
            dvRowStart = sheetIndex * sheetRows;
            dvRowEnd = dvRowStart + sheetRows - 1;
            if (dvRowEnd > dt->Rows->Count - 1)
            {
                dvRowEnd = dt->Rows->Count - 1;
            }
            //创建一个Sheet
            if (nullptr == xSt)
            {
    xSt = (Excel::Worksheet ^)xBk->Worksheets->Add(System::Type::Missing, System::Type::Missing, 1, System::Type::Missing);
            }
            else
            {
    xSt = (Excel::Worksheet^)xBk->Worksheets->Add(System::Type::Missing, xSt, 1, System::Type::Missing);
            }
            //设置Sheet的名称
            xSt->Name = title;
            if (sheetCount > 1)
            {
    xSt->Name += System::Convert ::ToString ((int)(sheetIndex + 1));
            }
            //取得标题
 
    //合并单元格
   System::Object ^ cell1=excel->Cells [rowIndex,colIndex];
   System::Object ^ cell2=excel->Cells [rowIndex,dt->Columns ->Count ];
   Microsoft::Office ::Interop ::Excel ::Range ^ range=(Microsoft::Office ::Interop ::Excel ::Range ^)xSt->Range [cell1,cell2];
   range->MergeCells =true;
   //一级表头
   excel->Cells [rowIndex,colIndex]=title;
   excel->ActiveCell ->Font ->Size =20;
   excel->ActiveCell ->HorizontalAlignment =Microsoft::Office ::Interop ::Excel ::Constants ::xlCenter ;//居中

   //二级表头
   for(int i =0;i<dt->Columns->Count;i++)
   {
                excel->Cells[rowIndex+1, colIndex++] = dt->Columns[i]->ColumnName;
            }
            //取得表格中数据
            int drvIndex;
            for (drvIndex = dvRowStart; drvIndex <= dvRowEnd; drvIndex++)
            {
    DataRow^ row = dt->Rows[drvIndex];
                //新起一行,当前单元格移至行首
                rowIndex++;
                colIndex = 1;
                for(int i =0;i<dt->Columns->Count;i++)
                {
     if (dt->Columns[i]->DataType == System::Type::GetType("System.DateTime"))
                    {
      excel->Cells[rowIndex+1, colIndex] = System::Convert::ToString(row[dt->Columns[i]->ColumnName]);//time2;
                    }
                    else if (dt->Columns[i]->DataType == System::Type::GetType("System.String"))
                    {
                        excel->Cells[rowIndex+1, colIndex] = row[dt->Columns[i]->ColumnName]->ToString();
                    }
                    else
                    {
                        excel->Cells[rowIndex+1, colIndex] = row[dt->Columns[i]->ColumnName]->ToString();
                    }
                    colIndex++;
                }
            }
        xBk->SaveCopyAs(filename);
        xBk->Close(false, nullptr, nullptr);
        excel->Quit();

  System::Runtime::InteropServices::Marshal::ReleaseComObject(xBk);
        System::Runtime::InteropServices::Marshal::ReleaseComObject(excel);
        System::Runtime::InteropServices::Marshal::ReleaseComObject(xSt);

        xBk = nullptr;
        excel = nullptr;
        xSt = nullptr;
  System::GC::Collect();
        //返回写入服务器Excel文件的路径
        return 1;
    }
    catch(Exception^ ex)
    {
  MessageBox::Show(ex->ToString());
        return -1;
    }
   
}

转载于:https://www.cnblogs.com/fmlblog/p/3188095.html

C#中,使用NPOI库(.NET版的Apache POI)可以方便地操作Excel文件,包括创建复杂的表头。NPOI支持`XSSF`(基于XML的Excel)和`HSSF`(基于二进制的旧版本)。 要导出一个复杂表头,你可以这样做: 1. 首先,你需要引用NPOI库,可以在NuGet包管理器中安装`NPOI.Excel`。 2. 创建一个`XSSFWorkbook`对象,这是Excel工作簿的实例。 3. 使用`CreateSheet()`方法创建一个新的工作表。 4. 对于复杂的表头,你可以创建一个自定义的`CellStyle`。这可以设置字体、颜色、合并单元格等样式属性。例如,你可以创建一个标题样式,使得某些单元格合并并加粗。 ```csharp var headerCellStyle = workbook.CreateCellStyle(); headerCellStyle.Font = workbook.GetFont("Arial", FontHeight.Huge, FontStyle.Bold); headerCellStyle.VerticalAlignment = VerticalAlignment.Center; ``` 5. 接下来,使用`Row`对象表示一行,并使用`CreateRow()`方法创建新的行。 6. 调用`AutoFitColumn()`方法对包含表头的列自动调整宽度,以适应内容。 7. 然后,给每一列添加表头单元格(`Cell`),并将它们设置到相应的行(`Row`)中,并应用自定义的样式。 ```csharp // 假设你有一个表头数组,如 List<string> headerList = new List<string>() { "姓名", "年龄", "职位" }; var headerRow = rowFactory.CreateRow(0); // 第一行作为表头 for (int i = 0; i < headerList.Count; i++) { var cell = headerRow.CreateCell(i); cell.SetCellValue(headerList[i]); cell.CellStyle = headerCellStyle; } ``` 8. 最后,保存整个工作簿: ```csharp usingFileStream = File.OpenWrite("output.xlsx"); workbook.Write(outputFileStream); workbook.Close(); usingFileStream.Dispose(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值