#はじめに
古いフォーマットのExcel、Wordからデータを取得したく、フリーのライブラリを探していたところ、Excel、Wordをインストールしていなくても読み込みができるライブラリを見つけたので掲載する。
Free Spire.Doc for .NET 5.5.0
Free Spire.XLS for .NET 7.8.0
Tutorials
今まで、文章のようなExcel Bookしか扱ってこなかったためFree Spire.XLSで問題なかったが、300件を超えるデータを扱うとFreeバージョンの制限で読み込みない。
調べると下記ライブラリを見つけた。
NPOI
Spire.XLSより使いにくいが、単純にデータを読み込むだけならそこそこつかえた。
#使い方
Tutorialsを見ると書き込み方は詳細に書かれているが、読み込み方については見つけられなかった。英語がわからないだけかもしれないが・・・
読み込みは、書き込み方を参照しながら読み込むことができたので、簡単なサンプルを作成した。
OLEを使った読み込みより、高速に読み込みできる。
##Excel
###ファイルの読み込み
var book = new Workbook();
book.LoadFromFile("sample.xls");
###MemoryStreamからの読み込み
using (var mst = new MemoryStream(data))
{
var book = new Workbook();
book.LoadFromStream(mst);
}
###データの取得
var book = new Workbook();
book.LoadFromFile("sample.xls");
var sheet = book.Worksheets[0];
// アドレスA1のセルの内容を表示
Console.WriteLine(sheet.Range["A1"].Text);
###CheckBoxの取得
CheckBoxが有効になっているときCheckBoxを取得できる。無効(ActiveX インストールされていない)の場合は、CheckBoxsは件数0となるので注意が必要。
var path = @"excelbook.xls";
var book = new Workbook();
book.LoadFromFile(path);
var sheet = book.Worksheets.First();
for (int i = 0; i < sheet.CheckBoxes.Count; i++ )
{
var chk = sheet.CheckBoxes[i];
Console.WriteLine(chk.CheckState.ToString());
}
##Word
###ファイルの読み込み
var doc = new Document();
doc.LoadFromFile("sample.doc", FileFormat.Doc);
###MemoryStreamからの読み込み
using (var mst = new MemoryStream(data, FileFormat.Doc))
{
var doc = new Document();
doc.LoadFromFile("sample.doc");
}
###データの取得
表をつかっていないとき
var doc = new Document();
doc.LoadFromFile("sample.doc", FileFormat.Doc);
// 1行目のデータを表示
Console.WriteLine(doc.Sections[0].Praragraphs[0].Text);
表を使っているとき
var doc = new Document();
doc.LoadFromFile("sample.doc", FileFormat.Doc);
// テーブルの各セルの内容を表示
foreach (Section sec in doc.Sections)
{
// Spireの各種コレクションからの返りはobjectなので明示的に型を定義
foreach(Table tbl in sec.Tables)
{
foreach(TableRow row in tbl.Rows)
{
foreach(TableCell cell in row.Cells)
{
// ParagraphはSpire.Docから指定する必要あり
foreach (Spire.Doc.Documents.Paragraph para in cell.Paragraphs)
Console.WriteLine(para.Text);
}
}
}
}
##NPOIでのデータ読み込み
1行をstring配列にして返す。
using NPOI.SS.UserModel;
private IEnumerable<string[]> GetData(string path)
{
var book = WorkbookFactory.Create(path);
var sheet = book.GetSheetAt(0);
var lastRow = sheet.LastRowNum;
foreach (var row in Enumerable.Range(0, sheet.LastRowNum + 1)
.Select(i => sheet.GetRow(i)).Where(r => r != null))
{
yield return Enumerable.Range(0, row.LastCellNum + 1)
.Select(i => row.GetCell(i))
.Select(c => c == null ? "" : c.ToString()).ToArray();
}
}
#注意点
Spire.XlsとSpire.Docは同時に使えないので、プロジェクトを分ける必要がある。
それぞれ共通で使用しているdllのバージョンが違うのが原因と思われる。