C#からExcelファイルを開いて内容を読みだす必要が出てきたので少し調べものメモ。
NPOI
パッと思いつくのはInterop.Excelを使ってのアクセスですが、Office365が入ってきている環境でバージョン依存になったりするプログラムにしたくないので、このやり方は却下。となると、直接Excel等にアクセスできるライブラリなどを探す必要があったのですが、ここで紹介されていたNPOIが良さげなので試すことにしました。
対象のExcelファイルは.xls形式だったので、残念ながらClosedXMLは使えず。その点でNPOI採用ということで。
NPOIを試す
ここに例示されていたのはファイルへの書き込みサンプル。ほしいのは読み出し処理。ということでこちらを参考にして読みだし処理を書いてみました。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
namespace CreateCSV
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void ImportButton_Click(object sender, EventArgs e)
{
HSSFWorkbook workbook;
using (FileStream file = new FileStream(@"sample.xls",FileMode.Open,FileAccess.Read))
{
workbook = new HSSFWorkbook(file);
}
//workbook.SetSheetHidden(1, SheetState.Visible);
//MessageBox.Show(workbook.IsSheetHidden(1).ToString());
ISheet sheet = workbook.GetSheet("データ");
ViewTextBox.Text = string.Empty;
StringBuilder resultBuilder = new StringBuilder();
for (int rowno = 0; rowno <= sheet.LastRowNum; rowno++)
{
if (sheet.GetRow(rowno) != null)
{
resultBuilder.Append(sheet.GetRow(rowno).GetCell(0).StringCellValue);
}
}
ViewTextBox.Text = resultBuilder.ToString();
}
}
}できました。とりあえず「データ」シートに書いてある各行の内容をテキストボックスに吐き出します。この「データ」シートですが、非表示設定にしてあっても無事読み出すことができました。
なお、「GetCell(0)」だけで取り出した場合、数式があるセルだと数式が取り出されてしまいます。そこで、上記の例では「GetCell(0).StringCellValue」で値を読むようにしています。
このあたりについて説明されているドキュメントが見つけられなかったのですが、NPOIではなくもともとのApacheプロジェクトのPOIドキュメントでリファレンスマニュアルがあったので、そちらを参考にして書いています。
- org.apache.poi.ss.usermodel / Interface Workbook
- https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Workbook.html

- 作者: arton
- 出版社/メーカー: 翔泳社
- 発売日: 2016/06/09
- メディア: Kindle版
- この商品を含むブログを見る