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

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

ただいまの
回答率

87.91%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 12K+

score 10

前提・実現したいこと

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#での知識でもご教授頂ければ幸いです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

Dim CSV As New System.Collections.ArrayList()
        Dim CSVData As New FileIO.TextFieldParser("C:\Temp\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 ArrayList
        While Not CSVData.EndOfData
            Dim fields As String() = CSVData.ReadFields()

            outData = New ArrayList
            For Each field In fields
                If IsNumeric(field) Then
                    outData.Add(Decimal.Parse(field))
                Else
                    outData.Add(field)
                End If
            Next
            CSV.Add(outData.ToArray())

        End While
        CSVData.Close()

        Dim book As New ClosedXML.Excel.XLWorkbook(ClosedXML.Excel.XLEventTracking.Disabled)
        Dim sheet As ClosedXML.Excel.IXLWorksheet = book.Worksheets.Add("Sheet1")
        sheet.Range("A1").Value = CSV
        book.SaveAs("C:\Temp\XLSXSample.xlsx")

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

Dim CSVData As New FileIO.TextFieldParser("C:\Temp\CSV.csv", System.Text.Encoding.GetEncoding(932))
        CSVData.TextFieldType = FileIO.FieldType.Delimited
        CSVData.Delimiters = New String() {","}
        CSVData.HasFieldsEnclosedInQuotes = True
        CSVData.TrimWhiteSpace = True

        Dim book As New ClosedXML.Excel.XLWorkbook(ClosedXML.Excel.XLEventTracking.Disabled)
        Dim sheet As ClosedXML.Excel.IXLWorksheet = book.Worksheets.Add("Sheet1")

        Dim rowIndex As Integer = 0
        While Not CSVData.EndOfData
            rowIndex = rowIndex + 1

            Dim fields As String() = CSVData.ReadFields()
            Dim colIndex As Integer = 0
            For Each field In fields
                colIndex = colIndex + 1
                If IsNumeric(field) Then
                    sheet.Cell(rowIndex, colIndex).Value = Decimal.Parse(field)
                Else
                    sheet.Cell(rowIndex, colIndex).Value = field
                End If
            Next
        End While
        CSVData.Close()

        book.SaveAs("C:\Temp\XLSXSample2.xlsx")

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/29 09:48

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/24 18: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++;
    }
    ```
    すみません。よろしくお願い致します。

    キャンセル

  • 2016/08/25 15:51

    このエラーはどのようなソースにしたら、
    エラーとなったのでしょうか?
    XLCell.csは、ClosedXMLの内部ソースでしょうか?

    前にコメントしてます。
    配列に入れないで出力は試されましたか?

    キャンセル

  • 2016/08/26 09: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
    ```

    キャンセル

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

  • ただいまの回答率 87.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る