星期六, 9月 14, 2024

[C#] Microsoft.Office.Interop.Excel

閱讀這兩篇官方文章的筆記

nuget 上安裝 Microsoft.Office.Interop.Excel

文章內還是加入 Excel dll 作法,現在可以直接在 nuget 上安裝囉

C# Code
using System;
using System.Collections.Generic;
using Excel = Microsoft.Office.Interop.Excel;

namespace Automation
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var bankAccounts = new List<Account>
            {
                new Account{ID = 345,Balance = 541.27m},
                // 故意把數字變長,超過欄位寬度,AutoFit() 效果才能感受的到
                new Account{ID = 999999999,Balance = -127.44m}
            };

            // 透過 delegate 來塞值並變化背景顏色
            DisplayInExcel(bankAccounts, (account, cell) =>
            {
                cell.Value = account.ID;
                cell.Offset[0, 1].Value = account.Balance;

                if (account.Balance < 0)
                {
                    cell.Interior.Color = Color.Red;
                    cell.Offset[0, 1].Interior.Color = 255;
                }
            });
        }

        /// <summary>
        /// 顯示 Excel 
        /// </summary>
        /// <param name="accounts">資料來源</param>
        /// <param name="DisplayFunc">透過 Delegate 讓主程式可以自訂定義 Excel 內的商業邏輯</param>
        static void DisplayInExcel(
            IEnumerable<Account> accounts,
            Action<Account, Excel.Range> DisplayFunc)
        {
            var excelApp = new Excel.Application();
            excelApp.Workbooks.Add();
            excelApp.Visible = true;
            excelApp.Range["A1"].Value = "ID";
            excelApp.Range["B1"].Value = "Balance";

            // 設定下述迴圈起點
            excelApp.Range["A2"].Select();
            foreach (var ac in accounts)
            {
                DisplayFunc(ac, excelApp.ActiveCell);
                excelApp.ActiveCell.Offset[1, 0].Select();
            }

            // 把 A1:B3 這範圍內容複製至剪貼簿
            excelApp.Range["A1:B3"].Copy();

            // 調整資料行寬度來完全顯示內容。
            excelApp.Columns[1].AutoFit();
            excelApp.Columns[2].AutoFit();
        }
    }

    public class Account
    {
        public int ID { get; set; }
        public decimal Balance { get; set; }
    }
}

儲存格顏色

以前在 VFP 是透過 ColorIndex 來進行設定,詳見 [VFP] Automation 應用 - 改變 Excel 儲存格顏色 紀錄,官方文章是使用 Color 來進行設定,但使用顏色十進制來塞值,一整個不直覺
cell.Interior.Color = Color.Red;
cell.Offset[0, 1].Interior.Color = 255;

Range.Select()

官方文章都是透過 Range.Select() 來進入指定 cell,但一直覺得不是該使用 Range.Activate();,在該篇官方文章 Working with the Active Cell 有說明
To select a range of cells, use the Select method. To make a single cell the active cell, use the Activate method.

複製至剪貼簿
excelApp.Range["A1:B3"].Copy();
執行後在 txt 上直接貼上就可以看見啦
調整資料行寬度來完全顯示內容
excelApp.Columns[1].AutoFit();

沒有留言:

張貼留言