19

ClosedXML を使用して、データ テーブル オブジェクトを Excel スプレッドシートに変換し、ユーザーに表示します。DataTable オブジェクトは、すべての db 値 (NHibernate から) を文字列に割り当ててから、以下のようにフォーマットするだけで構築されます。

  //formatting
EstimatedCost = Currency.SafeToString(Currency.Create(n.EstimatedCost)),

次に、列の型をプロパティの型、つまりすべての場合で String に設定します。

列が通貨に設定されているが、数値がテキスト警告として含まれているため、出力 Excel シートで何が起こるか、正しく並べ替えられません。

私の問題は、すべてのデータを DataTable に組み込むため、ClosedXML 列を正しく装飾する機会がないことです。私が考えていないこれを行う簡単な方法はありますか?

public const string ExcelDataType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml";

public static MemoryStream GenerateExcelFileFromData(IEnumerable<KeyValuePair<string, DataTable>> tabs, int colWidth = 100)
{
  var workbook = new XLWorkbook { ColumnWidth = colWidth };
  foreach (var enumerable in tabs)
  {
    workbook.Worksheets.Add(enumerable.Value, enumerable.Key);
  }

...

 public static DataTable ConvertToDataTable<T>(IEnumerable<T> varlist, List<string> excludedColumns, bool titleizeColumn = false)
 {
   var dtReturn = new DataTable();

   // column names 
   PropertyInfo[] oProps = null;

   if (varlist == null) return dtReturn;

    foreach (T rec in varlist)
    {
     // Use reflection to get property names, to create table, Only first time, others will follow 
        if (oProps == null)
        {
           oProps = rec.GetType().GetProperties();
              foreach (PropertyInfo pi in oProps)
               {
                    if (excludedColumns.Contains(pi.Name))
                    {
                        continue;
                    }
                    var colType = pi.PropertyType;
                    dtReturn.Columns.Add(new DataColumn(GetColumnName(pi, titleizeColumn), colType));
                }
          }

        DataRow dr = dtReturn.NewRow();

        foreach (var pi in oProps.Where(pi => !excludedColumns.Contains(pi.Name)))
          {
             try
                {
                    dr[GetColumnName(pi, titleizeColumn)] = pi.GetValue(rec, null) ?? DBNull.Value;
                }
                catch (ArgumentException)
                {
                    dr[GetColumnName(pi, titleizeColumn)] = DBNull.Value;
                }
            }
            dtReturn.Rows.Add(dr);
        }
        return dtReturn;
4

3 に答える 3

27

次の方法で通貨の値をフォーマットできます。

worksheet.Cell(rowIndex, columnIndex).Style.NumberFormat.Format = "$0.00";
worksheet.Cell(rowIndex, columnIndex).DataType = XLCellValues.Number; // Use XLDataType.Number in 2018 and after
于 2015-12-18T17:02:26.983 に答える
-2
ws.Cell(ro, co).Style.NumberFormat.Format = "[$$-en-US] #,##0.00";
ws.Cell(ro, co).DataType = XLDataType.Number;
于 2020-01-10T15:42:54.620 に答える