2012年12月25日火曜日

[.net]Excel出力する際の注意点

.netでアプリケーションを作成していると要望として挙げられるのが、
DBからExcelに出力をして欲しいと言う事。

なので、検索してDBからデータを取得してDataGridViewを作成→DataGridViewのデータをExcelへ出力をパターン化しています。

その際に注意しているのが、アーリーバインディングとレイトバインディングのどちらかを使用とする事。
私はインストール先のクライアントのOfficeのバージョンによって挙動が違うのが嫌なので、レイトバインディングでコーディングをしています。
(昔、 アーリーバインディングで痛い目を見たと言うのもある…。)

Excel 2003で動作確認をしたものが、Excel 2007でも問題無く動作確認できたので、
Excel 2010、Excel 2012でも問題なくいけそうだと思っています。

コード等については次回以降。

2012年12月18日火曜日

[.net]ある日付が第何週かを算出する関数[訂正]

SQL SERVERやExcelであの日付がその年の第何週かを求める式はあるけど、 .netだと該当するものがないので自作してみた。
PRINT DATEPART(week, '2012/12/18')
--51と表示される
 ''日付から年内の第何週かを取得する
 Public Function WeekOfYear(Byval pDateTime As DateTime) Integer
     ''日付から年間積算日を取得
     Dim DayOfYear As Integer = DateTime.Now.DayOfYear '353がセットされる
     Dim WeekNum   As Integer = (DayOfYear / 7 ) + 1

     ''1年は52週なので52週をオーバーしたら1週目にする
     ''→53週でも問題ありません
     ''If WeekNum > 52 Then
     ''    WeekNum = 1
     ''End If

     Return WeekNum
 End Function

 ''使い方

 ''1.算出したい日付をセット
 Dim DateNow   As DateTime = DateTime.Parse("2012/12/18")

 ''2.関数で第何週かを取得
 Console.WriteLine(WeekOfYear(DateNow).ToString())
 ''51と表示される 
 
今年の最終週(12/30・12/31)で計算すると53となるので、53なら1にする調整が必要かも。 
2012/12/20訂正
1/1になると、1週になるので、12/30・31が53週でも問題ありませんでした。

2012年12月8日土曜日

[.net]DataTable.Selectメソッドではまった事[追記]

DataGridViewとDataTable.Selectの組み合わせで処理をしようしてはまったのでメモ。
(2012/12/15追記有り)

処理の流れとしては
  1. DBからDataTableを取得。
  2. DataTableにチェックボックスの列を追加。
    (Boolean型でDataColumnsを追加)
  3. DataGridViewのDataSourceにDataTableをセット
  4. DataGridViewでチェックボックスをオン/オフにする
  5. 出力ボタンを押して、チェックボックスがオンのもののみDBにデータを追加
  6. チェックボックスを全て選択する/解除するボタンを作り、処理も追加する
はまった箇所は5と6。

チェックボックスがオンのものものを抜き出す処理で、
DataTable.Select("チェックボックスの列 = True")でDataRowの配列に出力が出来るのだが、
チェックボックスを全て選択すると、この配列に入る結果がチェックボックスに入れたものと一致しない。

DataGridView上の確定とずれているのかもとDataTableを調べたが、DataTable上は正しく確定されている。
仕方ないので、DataTableをFor文で回して抜き出す事に。
DataTable.Selectメソッド内でのバグかなぁ。

2012/12/15追記
スッキリはしないけど解決しました。
DataGridViewのDataSourceにDataTableをセットした後に、DataGridView.Selectを指定する。
指定した後は、正しく値が取れるようになりました。

2012年12月3日月曜日

[.net]時間計算の方法

.netで時間の加算、減算をする方法としては
  • DateTimeオブジェクトのAddメソッドを利用する
  • DateTimeオブジェクトのTicksプロパティとTimeSpan.TicksPerフィールドを使用する
例:DateTimeオブジェクトのAddメソッドを利用して時間を加算する。
 DateTime.Now.AddYears(1)        '1年を加算する
 DateTime.Now.AddMonth(1)        '1月を加算する
 DateTime.Now.AddDays(1)            '1日を加算する
 DateTime.Now.AddHours(1)        '1時間を加算する
 DateTime.Now.AddMinutes(1)        '1分を加算する
 DateTime.Now.AddSeconds(1)        '1秒を加算する
 DateTime.Now.AddMillSeconds(1)    '1ミリ秒を加算する

例:DateTimeオブジェクトのTicksプロパティとTimeSpan.TickPerフィールドを利用して時間を加算する。
 DateTime.Now.Ticks + (1 * TimeSpan.TicksPerDay)            '1日を加算する
 DateTime.Now.Ticks + (1 * TimeSpan.TicksPerHour)        '1時間を加算する
 DateTime.Now.Ticks + (1 * TimeSpan.TicksPerMinute)        '1分を加算する
 DateTime.Now.Ticks + (1 * TimeSpan.TicksPerSecond)        '1秒を加算する
 DateTime.Now.Ticks + (1 * TimeSpan.TicksPerMillSecond)    '1ミリ秒を加算する

また、Ticksプロパティを使うと、四則演算で時間計算が出来る。

例:Tikcsプロパティを使い、今の時間と、今の時間に1時間加算した差を出す。
 Dim DateTime1 As DateTime = DateTime.Now    '今の時間
 Dim DateTime2 As DateTime = New DateTime(DateTime1.Ticks + (1 * TimeSpan.TicksPerHour))    '今の時間+1時間
 DateTime2.Ticks - DateTime1.Ticks = 36,000,000,000
時間の差を求めるなら、Substractを利用しても算出が可能になる。

例:Substractを利用して、今の時間と、今の時間に1時間加算した差を出す。
 Dim DateTime1 As DateTime = DateTime.Now            '今の時間
 Dim DateTime2 As DateTime = DateTime1.AddHours(1)    '今の時間に1時間加算
 DateTime2.Substract(DateTime1).Tikcs = 36,000,000,000