DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Excelの1列目のみ読み込まない

環境/言語:[WindowsXP、C# 、Visual Studio 2008]
分類:[.NET]

ExcelをC#で読み込むプログラムを書いています。
Excelの1行目が列タイトル、2行目からデータを格納して2列目に値が存在しない時に終了したいです。
(1列目が空白なら別のクラスで番号を振るっています)。
DataTableにExcelのセルに入っている値を読み込みたいのですが、何故か1列目だけ""(空白文字列)で読み込んでしまいます。
解決方法を教えて下さい。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
using System.Data.OleDb;

...

private static DataTable ExcelReader()
{
string ExcelBookFileName = getFullPath(); //Excelファイルのフルパス
string strNow = DateTime.Now.ToString("#M/d/yyyy H:m:s#"); //現在の日時
DataTable dtImport = new DataTable();
if (ExcelBookFileName.Length != 0) //フルパスが指定されていたら
{
Microsoft.Office.Interop.Excel.Application ExcelApp
= new Microsoft.Office.Interop.Excel.Application();
ExcelApp.Visible = false;
Excel.Workbooks woBooks = ExcelApp.Workbooks;
Excel.Workbook woBook = null;

woBook = woBooks.Open(ExcelBookFileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
Excel.Worksheet ws1 = (Excel.Worksheet)woBook.Worksheets[1];
ws1.Select(Type.Missing);
Excel.Range woCells;

int intRow = 0;

woCells = (Excel.Range)ws1.Cells[2, 2];
while (woCells.Text.ToString().Length != 0)
{
dtImport.Rows.Add();
for (int clms = 0; clms < 23; clms++)
{

if (intRow == 0)
{
woCells = (Excel.Range)ws1.Cells[1, clms + 1];
dtImport.Columns.Add(woCells.Text.ToString());
}

woCells = (Excel.Range)ws1.Cells[intRow + 2, clms + 1];

if (woCells.Text.ToString().Length == 0)
{
dtImport.Rows[intRow][clms] = "";
}
else
{
//woCells = (Excel.Range)ws1.Cells[intRow + 2, clms + 1];
dtImport.Rows[intRow][clms] = woCells.Text.ToString();
}
}
if (intRow == 0)
{
dtImport.Columns.Add("[DATETIME]");
}
dtImport.Rows[intRow][23] = strNow;
intRow++;
//While用セル再設定
woCells = (Excel.Range)ws1.Cells[intRow + 2, 2];

}

woBook.Close(false, Type.Missing, Type.Missing);
ExcelApp.Quit();
}
else
{
dtImport.Rows.Add();
dtImport.Columns.Add();
}
return dtImport;
}
■No31798に返信(ゆんたんさんの記事)
> 2列目に値が存在しない時に終了したい
> (1列目が空白なら別のクラスで番号を振るっています)。
> DataTableにExcelのセルに入っている値を読み込みたいのですが、何故か1列目だけ""(空白文字列)で読み込んでしまいます。

質問の本質は「日時として書式設定されているセルの値が取得できずに長さ 0 の文字列となってしまう」といったところでしょうか?
前提は上記のとおりなので、違うのであれば以下の回答は参考にならないです。
全部は見ていませんが、気になるのが、

> woCells.Text.ToString();

Text プロパティから取得ですか? もう 4 年近く触っていないので、記憶があいまいですが、Text プロパティは書式が保たれた状態 (書式形成された String) で取得できるとは限らなかったように記憶しています (限らないというのは取得できることも多分にあるからです)。
Value プロパティの内部値から取得するのが正しいような気がしますが...

# 以下は久しぶりな定型句になりますが、

各変数でそれぞれ参照取っているのは行儀が良いです。しかし、

> woCells

は、何度も参照が上書きされていて、COM の参照カウントがデクリメントされないですね。
ReleaseComObject はサンプルとして省略されているかもしれないと思いましたケド。
そうであっても woCells は loop 内外両方に存在しているので、たぶんに漏れていると思います。
わかっていて使っている人なら、ループ内外で別々の変数になると思うので、勝手にそう思っていますが、違う場合はお許しを。
この投稿はマルチポストです。もし元記事の投稿者にマルチポストの心当たりがない場合は、すぐに返信でお知らせください。

●マルチポストされている場所
http://bbs.wankuma.com/index.cgi?mode=al2&namber=68026

別の有益な回答があるのでリンク。

----------
この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのルールについて」をお読みください。

●書き込みのルールについて
http://dobon.net/vb/bbs/index.html

DOBON.NET | プログラミング道 | プログラミング掲示板