質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
ClosedXML

ClosedXMLは、Excel形式ファイル(.xlsx, .xlsm)の操作や読み書きのための.NETライブラリです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

20235閲覧

ClosedXMLでExcel生成をする際の「セルの書式設定」について。

OMO

総合スコア10

ClosedXML

ClosedXMLは、Excel形式ファイル(.xlsx, .xlsm)の操作や読み書きのための.NETライブラリです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/08/22 09:38

編集2017/01/26 07:15

###前提・実現したいこと
ClosedXMLでエクセルファイルの生成を行い、CSVでデータを読み込んでいます。

###発生している問題・エラーメッセージ
セルの型を通貨型に設定したのですが、「1234」と入力された場合、
「1,234」ではなく「1234」のまま、表示されてしまします。
ダブルクリックの後、エンターを押下すると通貨型「1,234」に変換されます。

エクセルホームからセルの書式設定を確認すると、通貨型になっています。
###該当のソースコード

sheet.Range("A1:AA11").Style.NumberFormat.SetFormat("#,##0")
Dim CSV As New System.Collections.ArrayList() Dim CSVData As New FileIO.TextFieldParser("C: \CSV.csv", System.Text.Encoding.GetEncoding(932)) CSVData.TextFieldType = FileIO.FieldType.Delimited CSVData.Delimiters = New String() {","} CSVData.HasFieldsEnclosedInQuotes = True CSVData.TrimWhiteSpace = True While Not CSVData.EndOfData Dim fields As String() = CSVData.ReadFields() CSV.Add(fields) End While sheet.Range("A1").Value = CSV CSVData.Close()

A1からA11の範囲を通貨型で表しています。
###補足情報(言語/FW/ツール等のバージョンなど)
・ClosedXML 0.76.0
https://closedxml.codeplex.com/releases/view/197852
・VS 2015
・VBで開発を行っております。C#での知識でもご教授頂ければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

追記ばかりじゃ、ソースにインデントされないようなので、別回答として
ry_さんのソースでは、
CSV(ArrayList)に追加していっているので、
縦にしか並んでないと思います。

ClosedXMLにて、縦横の範囲で値をセットするには、
ジャグ配列(配列の配列または、配列のList)にする必要があるようですので、
以下のようにしたら、吐き出しました。

VB.Net

1 Dim CSV As New System.Collections.ArrayList() 2 Dim CSVData As New FileIO.TextFieldParser("C:\Temp\CSV.csv", System.Text.Encoding.GetEncoding(932)) 3 CSVData.TextFieldType = FileIO.FieldType.Delimited 4 CSVData.Delimiters = New String() {","} 5 CSVData.HasFieldsEnclosedInQuotes = True 6 CSVData.TrimWhiteSpace = True 7 8 Dim outData As ArrayList 9 While Not CSVData.EndOfData 10 Dim fields As String() = CSVData.ReadFields() 11 12 outData = New ArrayList 13 For Each field In fields 14 If IsNumeric(field) Then 15 outData.Add(Decimal.Parse(field)) 16 Else 17 outData.Add(field) 18 End If 19 Next 20 CSV.Add(outData.ToArray()) 21 22 End While 23 CSVData.Close() 24 25 Dim book As New ClosedXML.Excel.XLWorkbook(ClosedXML.Excel.XLEventTracking.Disabled) 26 Dim sheet As ClosedXML.Excel.IXLWorksheet = book.Worksheets.Add("Sheet1") 27 sheet.Range("A1").Value = CSV 28 book.SaveAs("C:\Temp\XLSXSample.xlsx")

配列を使わない方法です。

VB.Net

1 Dim CSVData As New FileIO.TextFieldParser("C:\Temp\CSV.csv", System.Text.Encoding.GetEncoding(932)) 2 CSVData.TextFieldType = FileIO.FieldType.Delimited 3 CSVData.Delimiters = New String() {","} 4 CSVData.HasFieldsEnclosedInQuotes = True 5 CSVData.TrimWhiteSpace = True 6 7 Dim book As New ClosedXML.Excel.XLWorkbook(ClosedXML.Excel.XLEventTracking.Disabled) 8 Dim sheet As ClosedXML.Excel.IXLWorksheet = book.Worksheets.Add("Sheet1") 9 10 Dim rowIndex As Integer = 0 11 While Not CSVData.EndOfData 12 rowIndex = rowIndex + 1 13 14 Dim fields As String() = CSVData.ReadFields() 15 Dim colIndex As Integer = 0 16 For Each field In fields 17 colIndex = colIndex + 1 18 If IsNumeric(field) Then 19 sheet.Cell(rowIndex, colIndex).Value = Decimal.Parse(field) 20 Else 21 sheet.Cell(rowIndex, colIndex).Value = field 22 End If 23 Next 24 End While 25 CSVData.Close() 26 27 book.SaveAs("C:\Temp\XLSXSample2.xlsx")

データすくないので、まったく処理速度の差はありませんでした。
100行程度に変えても速度変わりないです。

投稿2016/08/26 07:38

KIYOSHI

総合スコア268

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OMO

2016/08/29 00:48

KIYOSHIさん ありがとうございました。 通貨型での出力をすることができました。 とても助かりました。本当にありがとうございます。
guest

0

セルにデータを書き込む部分はどのようになってますでしょうか?
"1234"をstringで書き込んでませんか?

投稿2016/08/23 09:02

KIYOSHI

総合スコア268

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OMO

2016/08/24 03:36

すみません、その通りでした。
OMO

2016/08/24 03:46

すみません、stringで書き込んでいました。 何もかもが初心者で、質問等が的外れかもしれませんが、どうぞよろしくお願い致します。 ``` Dim CSV As New System.Collections.ArrayList() Dim CSVData As New FileIO.TextFieldParser _ ("C:\CSV.csv", System.Text.Encoding.GetEncoding(932)) CSVData.TextFieldType = FileIO.FieldType.Delimited CSVData.Delimiters = New String() {","} CSVData.HasFieldsEnclosedInQuotes = True CSVData.TrimWhiteSpace = True Dim outData As Collection While Not CSVData.EndOfData Dim fields As String() = CSVData.ReadFields() outData = New Collection For Each field In fields If IsNumeric(field) Then outData.Add(field.Cast(Of Integer)) End If Next CSV.Add(fields) End While .Range("A1").Value = CSV CSVData.Close() ``` CSVの入出力を上記のコードに変更しましたが、うまくいきません…。 何か良い方法はないでしょうか・・・。
KIYOSHI

2016/08/24 07:55

Object型の配列に一度収めてから、 Range("A1").Value = CSV で出力されていますが、 Objectを経由しているからかもしれません。 配列を作らずに出力させてみたらいかがでしょう。 時間もあまり変わらないと思われます。
KIYOSHI

2016/08/24 08:38 編集

すみません。 コード見たら、CSVには、文字しかいれてませんね。 ```VB.NET For Each field In fields If IsNumeric(field) Then    outData.Add(field.Cast(Of Integer)) Else    outData.Add(field) End If Next CSV.Add(outData) ``` で行けるのではないでしょうか?
OMO

2016/08/24 09:32

エラーが発生してしまいました・・・。 ```エラー内容 型 'System.Reflection.TargetParameterCountException' のハンドルされていない例外が mscorlib.dll で発生しました 追加情報:パラメーター カウントが一致しません。 ``` ```XLCell.cs ★の部分が黄色くなってます var propertyInfo = m.GetType().GetProperties(); foreach (var info in propertyInfo) { if ((info as IEnumerable) == null) ★ SetValue(info.GetValue(m, null), ro, co);★ co++; } ``` すみません。よろしくお願い致します。
KIYOSHI

2016/08/25 06:51

このエラーはどのようなソースにしたら、 エラーとなったのでしょうか? XLCell.csは、ClosedXMLの内部ソースでしょうか? 前にコメントしてます。 配列に入れないで出力は試されましたか?
OMO

2016/08/26 00:34

エラーは私のコメントのコードのFor Each...Nextの部分を KIYOSHIさんの教えてくださったコードに変更致しました。 結果、上記のエラーが発生しました。 XLCell.csはClosedXMLの内部ソースです。 「配列に入れないで出力」ですが、どのように行えば良いかわからず、 上記コードを試しました。すみません。 また、下記のように修正したところ、指定したセルから縦にすべてのデータが 出力されました。型はinteger型で出力されていると思われ、 CSVの「1234」を「1,234」で出力することはできました。 ```VB.NET While Not CSVData.EndOfData Dim FIELDS As Object() = CSVData.ReadFields() For Each FIELD In FIELDS If IsNumeric(FIELD) Then FIELD = (New Int32() {FIELD}) End If CSV.Add(FIELD) '横で読んだのが縦に入る全部 Next 'CSV1.Add(FIELD) '最後の列だけ入る End While sheet.Range("D1").Value = CSV ' sheet.Range("D3").Value = CSV1 CSVData.Close() ``` ただ、先程も述べましたように、CSVのデータが縦に一列に入ってしまいます。 これは出力の方法が悪いのでしょうか。 ```CSVデータ 1234,1111,2222 3333,4444,5555 6666,7777,8888 ``` ```Excel出力結果 1,234 1,111 2,222 3,333 4,444 5,555 6,666 7,777 8,888 ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問