Excelのシートから日付セルの値を取り出す - C#
C#のプログラムでExcelのシートから日付セルの値を取り出すコードを紹介します。
概要
こちらで実装したプログラムでExcelのブックファイルを開きセルの値を取得できます。
しかし、ワークシートの日付・時刻のセルを読み取ると、数値で表示されてしまいます。この記事では、ワークシートの日付、時刻のセルを日付、時刻の形式で表示するコードを紹介します。
現象の確認
実行例1
下図のExcelブックファイルを作成します。
作成したExcelブックのファイルを
こちらで実装したプログラムで読み込むと以下の結果となります。
日付表示ではなく数値がテキストボックスに表示されています。
実行例2
下図のExcelブックファイルを作成します。
作成したExcelブックのファイルをプログラムで読み込むと以下の結果となります。
日付表示ではなく小数がテキストボックスに表示されています。
原因
Excelの日付、時刻の値は文字列ではなく、時間を表す数値で記述されているため、
値をそのまま読み込むと数値としての値が取得されるため、
上記の動作になります。
プログラム例
UI
下図のフォームを作成します。ボタンとMultilines プロパティをTrueに設定したテキストボックス、OpeFileDialogを配置します。
コード
下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
namespace ExcelFileAccessDateValue
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
string ExcelBookFileName = openFileDialog1.FileName;
Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
ExcelApp.Visible = false;
Workbook wb = ExcelApp.Workbooks.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);
Worksheet ws1 = wb.Sheets[1];
ws1.Select(Type.Missing);
Range range = ExcelApp.get_Range("A1", "A50");
if (range != null) {
for (int i = 1; i < range.Count; i++) {
DateTime val = DateTime.FromOADate(range.Value2[i, 1]);
textBox1.Text += string.Format("{0:s}\r\n", val.ToString("yyyy/MM/dd HH:mm:ss"));
}
}
}
}
}
}
解説
基本は
こちらで実装したコードとほぼ同じです。
日付・時刻を読み出す場合は
下記コードで、Range.Value2プロパティで読み出した値を、
DateTime.FromOADateメソッドに与えることでExcelセル中の数値、浮動小数の値をDateTime型に変換できます。
DateTime val = DateTime.FromOADate(range.Value2[i, 1]);
注意
下記のコードでA50セルまでの範囲を読み取る動作に実装しています。ExcelのワークシートにA50セルまで値を入れないとエラーになりますので、注意してください。
Range range = ExcelApp.get_Range("A1", "A50");
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
[button1]をクリックします。ファイルを開くダイアログが表示されます。
先ほど用意したExcelブックファイルを選択して開きます。
テキストボックスに以下の内容が表示されます。セルに入力した日付が表示できています。
もう一方の時刻を記載したブックも開きます。自国の値も読み取れています。
C#のプログラムでExcelのシートから日付セルの値を取り出せました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2013-05-24
改訂日: 2024-04-13