web-dev-qa-db-ja.com

Excelの列(またはセル)をC#のテキストとしてフォーマットしますか?

データテーブルからExcelシートに値をコピーすると、先行ゼロが失われます。これは、おそらくExcelが値をテキストではなく数値として扱うためです。

C#でワークシートを作成し、次のように値をコピーしています。

myWorksheet.Cells[i + 2, j] = dtCustomers.Rows[i][j - 1].ToString();

列全体または各セルをテキストとしてフォーマットするにはどうすればよいですか?関連する質問、キャスト方法myWorksheet.Cells[i + 2, j] Intellisenseでスタイルプロパティを表示するには?

33
Tony_Henrich

以下は、Excelと同様のAPIを備えた SpreadsheetGear for .NET の列AとCをテキストとしてフォーマットするコードです。これをExcel/COMで動作するように変換する方法を理解するのはそれほど難しくないはずです:

IWorkbook workbook = Factory.GetWorkbook();
IRange cells = workbook.Worksheets[0].Cells;
// Format column A as text.
cells["A:A"].NumberFormat = "@";
// Set A2 to text with a leading '0'.
cells["A2"].Value = "01234567890123456789";
// Format column C as text (SpreadsheetGear uses 0 based indexes - Excel uses 1 based indexes).
cells[0, 2].EntireColumn.NumberFormat = "@";
// Set C3 to text with a leading '0'.
cells[2, 2].Value = "01234567890123456789";
workbook.SaveAs(@"c:\tmp\TextFormat.xlsx", FileFormat.OpenXMLWorkbook);

免責事項:私はSpreadsheetGear LLCを所有しています

39
Joe Erickson

セルの書式設定をText priorに設定して先行ゼロ付きの数値を追加すると、アポストロフィを追加して結果を歪めることなく先行ゼロが保持されます。 Excelの既定のシートに先行ゼロ値を手動で追加してからテキストに変換しようとすると、先行ゼロが削除されます。最初にセルをテキストに変換してから、値を追加しても問題ありません。プログラムで行う場合も同じ原則が適用されます。

        // Pull in all the cells of the worksheet
        Range cells = xlWorkBook.Worksheets[1].Cells;
        // set each cell's format to Text
        cells.NumberFormat = "@";
        // reset horizontal alignment to the right
        cells.HorizontalAlignment = XlHAlign.xlHAlignRight;

        // now add values to the worksheet
        for (i = 0; i <= dataGridView1.RowCount - 1; i++)
        {
            for (j = 0; j <= dataGridView1.ColumnCount - 1; j++)
            {
                DataGridViewCell cell = dataGridView1[j, i];
                xlWorkSheet.Cells[i + 1, j + 1] = cell.Value.ToString();
            }
        }
13
svenGUTT

Excelに書き込む前に、形式を変更する必要があります。

xlApp = New Excel.Application
xlWorkSheet = xlWorkBook.Sheets("Sheet1")

Dim cells As Excel.Range = xlWorkSheet.Cells

'set each cell's format to Text
cells.NumberFormat = "@"

'reset horizontal alignment to the right
cells.HorizontalAlignment = Excel.XlHAlign.xlHAlignRight
6
sansalk

私も最近この問題と戦いましたが、上記の提案について2つのことを学びました。

  1. NumberFormattingを@に設定すると、Excelは値を左揃えし、テキストのように読み取りますが、それでも先頭のゼロは切り捨てられます。
  2. 先頭にアポストロフィを追加すると、Excelはそれをテキストとして扱い、ゼロを保持し、デフォルトのテキスト形式を適用して、両方の問題を解決します。

これの誤解を招く側面は、セルの値が変わったことです。幸いなことに、CSVにコピー/貼り付けまたはエクスポートする場合、アポストロフィは含まれません。

結論:先頭のゼロを保持するには、numberFormattingではなくアポストロフィを使用します。

4
Scott

Excel Interopで私のために働いたソリューション:

myWorksheet.Columns[j].NumberFormat = "@";      // column as a text
myWorksheet.Cells[i + 2, j].NumberFormat = "@"; // cell as a text

このコードはbeforeを実行して、データをExcelに書き込みます。列番号と行番号は1から始まります。

もう少し詳細。 SpreadsheetGearを参照して受け入れられた応答はほとんど正しいように見えますが、私は2つの懸念がありました。

  1. SpreadsheetGearを使用していません。サードパーティのライブラリを使用しないExcel相互運用機能を介した通常のExcel通信に興味があり、
  2. 「A:A」のような範囲を使用せずに、番号で列をフォーマットする方法を探していました。
3
sarh
   if (dtCustomers.Columns[j - 1].DataType != typeof(decimal) && dtCustomers.Columns[j - 1].DataType != typeof(int))
   {
      myWorksheet.Cells[i + 2, j].NumberFormat = "@";
   }
2
Arsac

WorkSheet.Columns.NumberFormatを使用して、string "@"に設定します。サンプルは次のとおりです。

Excel._Worksheet workSheet = (Excel._Worksheet)_Excel.Worksheets.Add();
//set columns format to text format
workSheet.Columns.NumberFormat = "@";

注:このテキスト形式は、穴のExcelシートに適用されます!

特定の列、たとえば最初の列にテキスト形式を適用する場合、これを行うことができます。

workSheet.Columns[0].NumberFormat = "@";

または、これにより、指定されたwoorkSheetの範囲がテキスト形式に適用されます。

workSheet.get_Range("A1", "D1").NumberFormat = "@";
1
Lester
//where [1] - column number which you want to make text

ExcelWorksheet.Columns[1].NumberFormat = "@";


//If you want to format a particular column in all sheets in a workbook - use below code. Remove loop for single sheet along with slight changes.

  //path were Excel file is kept


     string ResultsFilePath = @"C:\\Users\\krakhil\\Desktop\\TGUW Excel\\TEST";

            Excel.Application ExcelApp = new Excel.Application();
            Excel.Workbook ExcelWorkbook = ExcelApp.Workbooks.Open(ResultsFilePath);
            ExcelApp.Visible = true;

            //Looping through all available sheets
            foreach (Excel.Worksheet ExcelWorksheet in ExcelWorkbook.Sheets)
            {                
                //Selecting the worksheet where we want to perform action
                ExcelWorksheet.Select(Type.Missing);
                ExcelWorksheet.Columns[1].NumberFormat = "@";
            }

            //saving Excel file using Interop
            ExcelWorkbook.Save();

            //closing file and releasing resources
            ExcelWorkbook.Close(Type.Missing, Type.Missing, Type.Missing);
            Marshal.FinalReleaseComObject(ExcelWorkbook);
            ExcelApp.Quit();
            Marshal.FinalReleaseComObject(ExcelApp);
0
KR Akhil

私はこの質問が高齢であることを知っていますが、まだ貢献したいと思います。

申請中 Range.NumberFormat = "@"は、問題を部分的に解決するだけです。

  • はい、範囲のセルにフォーカスを置くと、フォーマットメニューでtextと表示されます
  • はい、データを左に揃えます
  • ただし、type数式を使用してセル内の値の型を確認すると、1は数値を意味しますを返します

アポストロフィを適用すると動作が改善されます。フォーマットをtextに設定し、データを左に揃え、type数式を使用してセル内の値のフォーマットをチェックすると、2意味テキスト

0
Patrik