misc.log

日常茶飯事とお仕事と

C#やVB.NETからExcelファイルを開いて操作する - NPOI試用

C#からExcelファイルを開いて内容を読みだす必要が出てきたので少し調べものメモ。

NPOI

パッと思いつくのはInterop.Excelを使ってのアクセスですが、Office365が入ってきている環境でバージョン依存になったりするプログラムにしたくないので、このやり方は却下。となると、直接Excel等にアクセスできるライブラリなどを探す必要があったのですが、ここで紹介されていたNPOIが良さげなので試すことにしました。

qiita.com

対象のExcelファイルは.xls形式だったので、残念ながらClosedXMLは使えず。その点でNPOI採用ということで。

NPOIを試す

ここに例示されていたのはファイルへの書き込みサンプル。ほしいのは読み出し処理。ということでこちらを参考にして読みだし処理を書いてみました。

stackoverflow.com

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


C#逆引きレシピ

C#逆引きレシピ