【问题标题】:C# Merge Cells where values are the sameC# 合并值相同的单元格
【发布时间】:2020-12-02 09:14:50
【问题描述】:

目标:

我的目标是合并特定列中具有相同值的单元格。

已经有将数据从 MySQL 导出到 Excel 的代码,只需要最后润色。

当前代码:

System.Data.DataTable dt = new System.Data.DataTable();
using(MySqlConnection conn = new MySqlConnection(ConnectionString.ConnString))
{
    conn.Open();
    using (MySqlDataAdapter da = new MySqlDataAdapter(@"SELECT b.productcode, b.ProductDescription, a.AreaName, b.MinimumMonths, LAST_DAY(DATE_ADD(NOW(), INTERVAL b.MinimumMonths MONTH)) AS BestBefore  FROM bestbeforedates b join area a on b.areaid = a.id;", conn))
    {
        da.Fill(dt);

        var excelApp = new Excel.Application();
        excelApp.Workbooks.Add();
        Excel._Worksheet worksheet = (Excel.Worksheet)excelApp.ActiveSheet;

        // Set all cells to text
        worksheet.Cells.NumberFormat = "@";

        worksheet.Cells[1, "A"] = "Product Code";
        worksheet.Cells[1, "B"] = "Product Description";
        worksheet.Cells[1, "C"] = "Area";
        worksheet.Cells[1, "D"] = "Minimum Months";
        worksheet.Cells[1, "E"] = "Best Before Date";

        int headerRow = 1;
        int startCol = 1;
        int maxCol = 6;
        for (int i = startCol; i < maxCol; i++)
        {
            Excel.Range currentRange = (Excel.Range)worksheet.Cells[headerRow, i];
            currentRange.Font.Bold = true;
        }


        var row = 1;
        foreach (DataRow allRow in dt.Rows)
        {
            row++;
            worksheet.Cells[row, "A"] = allRow["ProductCode"];
            worksheet.Cells[row, "B"] = allRow["ProductDescription"];
            worksheet.Cells[row, "C"] = allRow["AreaName"];
            worksheet.Cells[row, "D"] = allRow["MinimumMonths"];
            worksheet.Cells[row, "E"] = allRow["BestBefore"];
            worksheet.Columns.AutoFit();
        }

        Cursor.Current = Cursors.Default;
        // Show excel app
        excelApp.Visible = true;

    }
}

输出

期望的输出

问题

如果值相同,如何合并这些单元格?

编辑:

这是我到目前为止的地方..它没有合并所需的单元格..但正在研究为什么不合并。

var row = 1;

DataRow prevRow = dt.NewRow();

foreach (DataRow allRow in dt.Rows)
{
    row++;
    worksheet.Cells[row, "A"] = allRow["ProductCode"];
    worksheet.Cells[row, "B"] = allRow["ProductDescription"];
    worksheet.Cells[row, "C"] = allRow["AreaName"];
    worksheet.Cells[row, "D"] = allRow["MinimumMonths"];
    worksheet.Cells[row, "E"] = allRow["BestBefore"];                           
    worksheet.Columns.AutoFit();

    
    if(allRow["MinimumMonths"].ToString() == prevRow["MinimumMonths"].ToString())
    {
        worksheet.Range[worksheet.Cells[row, "D"], worksheet.Cells[row, "D"]].Merge();
    }
    else
    {
        
    }

    prevRow = allRow;

}

【问题讨论】:

  • 你累了什么?
  • ` worksheet.Range[worksheet.Cells[row, "D"], worksheet.Cells[row, "D"]].Merge();` 范围没有意义,它只是同样,我建议只是自己测试合并,就像让语法正常工作,然后弄清楚如何动态合并

标签: c# excel


【解决方案1】:

尝试以下方法:

if (row > 2 && allRow["MinimumMonths"].ToString() == prevRow["MinimumMonths"].ToString())
{
    worksheet.Range[worksheet.Cells[row - 1, "D"], worksheet.Cells[row, "D"]].Merge();
}

这是完整的代码:

var row = 1;

DataRow prevRow = dt.NewRow();
foreach (DataRow allRow in dt.Rows)
{

    row++;
    worksheet.Cells[row, "A"] = allRow["ProductCode"];
    worksheet.Cells[row, "B"] = allRow["ProductDescription"];
    worksheet.Cells[row, "C"] = allRow["AreaName"];
    worksheet.Cells[row, "D"] = allRow["MinimumMonths"];
    worksheet.Cells[row, "E"] = allRow["BestBefore"];
    worksheet.Columns.AutoFit();


    if (row > 2 && allRow["MinimumMonths"].ToString() == prevRow["MinimumMonths"].ToString())
    {
        worksheet.Range[worksheet.Cells[row - 1, "D"], worksheet.Cells[row, "D"]].Merge();
    }

    //set value
    prevRow = allRow;
}

如果您不需要使用 Excel,而只是需要创建 Excel 工作簿,您可能需要考虑使用DocumentFormat.OpenXml

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多