簡體   English   中英

C# 合並值相同的單元格

[英]C# Merge Cells where values are the same

目標:

我的目標是合並特定列中具有相同值的單元格。

已經有將數據從 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;

    }
}

Output

在此處輸入圖像描述

所需 Output

在此處輸入圖像描述

如果值相同,如何合並這些單元格?

編輯:

這是我到目前為止的地方..它沒有合並所需的單元格..但正在研究為什么不是。

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;

}

請嘗試以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM