Doc、Xls形式のファイルを読み込む

#はじめに
古いフォーマットのExcel、Wordからデータを取得したく、フリーのライブラリを探していたところ、Excel、Wordをインストールしていなくても読み込みができるライブラリを見つけたので掲載する。
[ Free Spire.Doc for .NET 5.5.0 ](https://www.nuget.org/packages/FreeSpire.Doc/)
[ Free Spire.XLS for .NET 7.8.0 ](https://www.nuget.org/packages/FreeSpire.Xls/)
[Tutorials](http://www.e-iceblue.com/Tutorials.html)
今まで、文章のようなExcel Bookしか扱ってこなかったためFree Spire.XLSで問題なかったが、300件を超えるデータを扱うとFreeバージョンの制限で読み込みない。
調べると下記ライブラリを見つけた。
[NPOI](https://www.nuget.org/packages/NPOI)
Spire.XLSより使いにくいが、単純にデータを読み込むだけならそこそこつかえた。

#使い方
Tutorialsを見ると書き込み方は詳細に書かれているが、読み込み方については見つけられなかった。英語がわからないだけかもしれないが・・・
読み込みは、書き込み方を参照しながら読み込むことができたので、簡単なサンプルを作成した。
OLEを使った読み込みより、高速に読み込みできる。
##Excel
###ファイルの読み込み

```csharp
var book = new Workbook();
book.LoadFromFile("sample.xls");
```

###MemoryStreamからの読み込み

```csharp
using (var mst = new MemoryStream(data))
{
    var book = new Workbook();
    book.LoadFromStream(mst);
}
```

###データの取得

```csharp
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は件数０となるので注意が必要。

```csharp
            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
###ファイルの読み込み

```csharp
var doc = new Document();
doc.LoadFromFile("sample.doc", FileFormat.Doc);
```

###MemoryStreamからの読み込み

```csharp
using (var mst = new MemoryStream(data, FileFormat.Doc))
{
    var doc = new Document();
    doc.LoadFromFile("sample.doc");
}
```

###データの取得
表をつかっていないとき

```csharp
var doc = new Document();
doc.LoadFromFile("sample.doc", FileFormat.Doc);

// １行目のデータを表示
Console.WriteLine(doc.Sections[0].Praragraphs[0].Text);
```

表を使っているとき

```csharp
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配列にして返す。

```csharp
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のバージョンが違うのが原因と思われる。