C#でExcelのシートに行と列を挿入したり削除したり
C#を使って、既存のExcelのワークシートに行や列の挿入と削除をします。MSDNを見てても例にたどり着かなかったので、これが真っ当なやり方なのかは自信ありません。
目次
シナリオ
E.P.らぼ の解説を参考にしました。ただし、そのままではうまくいかなくて、ちょっとアレンジしました。
基本的には、挿入/削除するセル範囲を参照するrangeオブジェクトを作って、insert() / delete() メソッドで挿入/削除をするという流れになります。
get_rangeメソッドが使えない
C#をExcelで操作する関連でいろいろググってみるとget_rangeメソッドを使ってrangeオブジェクトを作っている例が出てくるのですが、私の環境ではget_rangeがApplicationに定義されていないというエラーになります。参照漏れがないか確認するようにエラーメッセージでアドバイスされたのですが、Microsoft.Office.Interop.Excelはソリューションの「参照」に入ってるし、usingで読んでるんですが。
というわけで、こんな感じにrangeオブジェクトを作ってみました。
Microsoft.Office.Interop.Excel.Range ExcelRange = ExcelWorksheet.Range["6:6"];
range[]の引数はA1形式のセルの範囲です。例えば、B3というセルを単一で指定するなら”B3″、左上がB2で右下がD4の四角形の範囲を指定するなら”B2:D4″、6行全体を指定する場合は”6:6″というように指定します。
insertメソッドとdeleteメソッドの方向指定の仕方
insertメソッドの第1引数は、セルをシフトする方向です。XlInsertShiftDirection列挙体を使って指定します。
deleteメソッドの場合も同様に、 xldeleteshiftdirection列挙体 で指定します。
試してみた
フォームをロードすると、既存のExcelファイルを開いて、ワークシートに下記の操作をするアプリを作ってみました。
6行に行挿入
E列に列挿入
8列を削除
最初に ライブラリの参照 を追加してください。コードはこんな感じです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
namespace excel_trial_insert
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// Excelを起動する
Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
ExcelApp.Visible = true;
try
{
// コピー元のブック(ファイル)を開く
Microsoft.Office.Interop.Excel.Workbook ExcelWorkbook = ExcelApp.Workbooks.Open(@"Excelファイル名");
try
{
// コピー元のシートを選択する
Worksheet ExcelWorksheet = ExcelWorkbook.Sheets[1];
ExcelWorksheet.Select();
try
{
// 行の挿入
Microsoft.Office.Interop.Excel.Range ExcelRange = ExcelWorksheet.Range["6:6"];
try
{
ExcelRange.Insert(XlInsertShiftDirection.xlShiftDown);
}
finally
{
if (ExcelRange != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelRange);
}
}
// 列の挿入
Microsoft.Office.Interop.Excel.Range ExcelRange2 = ExcelWorksheet.Range["E:E"];
try
{
ExcelRange2.Insert(XlInsertShiftDirection.xlShiftToRight);
}
finally
{
if (ExcelRange2 != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelRange2);
}
}
// 行の削除
Microsoft.Office.Interop.Excel.Range ExcelRange3 = ExcelWorksheet.Range["8:8"];
try
{
ExcelRange3.Delete(XlDeleteShiftDirection.xlShiftUp);
}
finally
{
if(ExcelRange3 != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelRange3);
}
}
}
finally
{
if (ExcelWorksheet != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelWorksheet);
}
}
}
finally
{
if (ExcelWorkbook != null)
{
try
{
ExcelWorkbook.Close();
}
finally
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelWorkbook);
}
}
}
}
finally
{
if (ExcelApp != null)
{
try
{
ExcelApp.Quit();
}
finally
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);
}
}
}
}
}
}
COM参照削除のためのtryが多くて、見づらい。
テスト用に下図の様なExcelのファイルを準備しました。上手く動けば、小計欄と合計欄がそれぞれ外側に1つずつずれて、「以上」と書いてある行が合計欄の真下に来るはずです。
実行結果は下図の様になりました。
罫線が残ってしまいました。書式も変えないといけないですね。
実施例の環境は下記です。
Visual Studio Express 2015 for Windows Desktop (C#) Excel 2013 Windows 8.1
公開日
広告