C#からExcel操作 テンプレ - ライブラリレス（※要Excel）

# 1. コンパイル用バッチ

※Officeのバージョンに依存しますので、適宜変更してください。

```text:compile.bat

csc ^
 /r:C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll ^
 /r:C:\Windows\assembly\GAC_MSIL\office\15.0.0.0__71e9bce111e9429c\Office.dll ^
 %*
```

## 1-1. コンパイル方法
`compile.bat ほげほげ.cs`

# 2. 現在開いているExcelファイルのアクティブなシートを操作するテンプレ

・画面更新の停止
・再計算の停止

## 2-1. ソースコード

※開いているエクセルシートに対して処理を行うので、<b>むやみに実行しないでください</b>。

```csharp

using System;
using System.Runtime.CompilerServices; // to use [MethodImpl(MethodImplOptions.NoInlining)]
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;

class ExcelSample
{
    [MethodImpl(MethodImplOptions.NoInlining)] // 最適化抑制
    static void OverwriteActiveSheet()
    {
        Excel.Application oExcelApp = null;
        Excel.Worksheet oSheet = null;
        
        try {
            oExcelApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
        }
        catch ( System.Runtime.InteropServices.COMException ) {
            Console.WriteLine("Failed to get Excel.Application.");
            return;
        }
        
        try {
            var oBook = (Excel.Workbook)oExcelApp.ActiveWorkbook;
            if ( oBook != null ) {
                oSheet = (Excel.Worksheet)oBook.ActiveSheet;
            }
        }
        catch ( System.Runtime.InteropServices.COMException ) {
        }
        if ( oSheet == null ) {
            Console.WriteLine("Failed to get ActiveWorkbook or ActiveSheet.");
            return;
        }

        bool screenUpdatingBackup = oExcelApp.ScreenUpdating;
        Excel.XlCalculation calcModeBackup = oExcelApp.Calculation;
        try {
            oExcelApp.ScreenUpdating = false; // 画面更新の停止
            oExcelApp.Calculation = Excel.XlCalculation.xlCalculationManual; // 再計算の停止
            
            // 処理を追加  ここから

            // セルの読み込み
            Excel.Range oCells = oSheet.Cells;
            var oRange = oCells[3, 2] as Excel.Range; // B3セル
            Console.WriteLine(oRange.Value);
            Console.WriteLine(oRange.Value2);
            Console.WriteLine(oRange.Text);

            // セルへの書き込み
            oRange = oCells[4, 3] as Microsoft.Office.Interop.Excel.Range;
            oRange.Value = "hoge";

            // 罫線を引く
            Excel.Borders oBorders;
            Excel.Border oBorder;
            oRange = oSheet.Range[oSheet.Cells[2, 2], oSheet.Cells[4, 4]]; //  select B2 - D4
            oBorders = oRange.Borders;
            oBorder = oBorders[Excel.XlBordersIndex.xlEdgeBottom];// xlEdgeLeft xlEdgeRight xlEdgeTop
            oBorder.LineStyle = Excel.XlLineStyle.xlContinuous;

            // 処理を追加  ここまで
        }
        finally {
            if ( oExcelApp.Calculation != calcModeBackup ) {
                oExcelApp.Calculation = calcModeBackup;
            }
            if ( oExcelApp.ScreenUpdating != screenUpdatingBackup ) {
                oExcelApp.ScreenUpdating = screenUpdatingBackup;
            }
        }
    }

    [STAThread]
    static void Main(string[] args)
    {
        OverwriteActiveSheet();
    }
}
```

## 2-2. 入力データ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/51ee4014-ab90-17a3-7a8e-04dce842d713.png)

## 2-3. 実行結果

```text

2021/02/03 0:00:00
44230
2月3日
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/7be66cbb-c615-3477-2f69-bdfcfc425666.png)



# 3. Excelファイルを開く - 参考サイト

 - [Excelファイルを読み込み、セルの内容を表示する ： C# | iPentec](https://www.ipentec.com/document/csharp-open-read-excel-book-and-sheet)
 - [Workbooks.Open Method (Microsoft.Office.Interop.Excel) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.office.interop.excel.workbooks.open?view=excel-pia)
 - [【C#】Excelを操作する(起動、編集など) | CodeTips](https://kenhanda.com/c/%E3%80%90c%E3%80%91excel%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B%E8%B5%B7%E5%8B%95%E3%80%81%E7%B7%A8%E9%9B%86%E3%81%AA%E3%81%A9/) 【リンク切れ？】
 - [C#でExcelを操作！「開く・閉じる・保存」 - lisz-works](https://www.lisz-works.com/entry/cs2excel-base)【リンク切れ？】

# 4. 罫線を引く - 参考サイト

 - [C# EXCEL操作 罫線の引き方 | ひろにもブログ](https://hironimo.com/prog/c-sharp/c-excel-line/)
 - [C#からExcelを操作する(PIAその2) | tocsworld](https://tocsworld.wordpress.com/2014/06/09/c%E3%81%8B%E3%82%89excel%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8Bpia%E3%81%9D%E3%81%AE2/)

# 5. セル結合させる - 参考サイト

要約：`Range`に対して`Merge()`する

 - [C#からExcelを操作する(PIAその2) | tocsworld](https://tocsworld.wordpress.com/2014/06/09/c%E3%81%8B%E3%82%89excel%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8Bpia%E3%81%9D%E3%81%AE2/)

# 参考サイト
 - [セルの値を取得／設定する | C#でEXCELを読み込んで操作する方法を公開｜C# EXCEL操作テクニック.NET](HTTP://EXCELCSHARP.LANCE40.COM/POST-3.HTML)
 - [C#からExcelを操作する(PIAその2) | tocsworld](https://tocsworld.wordpress.com/2014/06/09/c%E3%81%8B%E3%82%89excel%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8Bpia%E3%81%9D%E3%81%AE2/)
 - [ざっちのーと 【C#】Excelを扱う時のテンプレート](http://zatti.blog81.fc2.com/blog-entry-54.html)
 - [_Application.ScreenUpdating Property (Microsoft.Office.Interop.Excel) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.office.interop.excel._application.screenupdating?view=excel-pia)
 - [Range.Value2 Property (Microsoft.Office.Interop.Excel) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.office.interop.excel.range.value2?view=excel-pia)
 - [C#でExcel操作の処理時間を計測してみた (Microsoft.Office.Interop.Excel) - Qiita](https://qiita.com/kob58im/items/a9b96d1737acf5bfdc1a)
 - [COMオブジェクトの解放のお作法 - C#(というか.NET) - Qiita](https://qiita.com/kob58im/items/59d1db73c5a6c2df45e7)

# Microsoft.Office.Interop.Excel を使う以外の選択肢

 - [Excelファイルを C# と VB.NET で読み込む "正しい" 方法 - Qiita](https://qiita.com/midori44/items/acab9106e6dad9653e73)