【问题标题】:Exporting data from a datagirdview to an excel sheet with decimals retained将数据从 datagridview 导出到保留小数的 Excel 工作表
【发布时间】:2014-12-11 21:54:19
【问题描述】:

我正在开发一个C# windows forms application,它使用Interop Open Library 15.0 将数据从DataGridView 导出到excel。我在 DataGridView 中的数据是这样的,它包含几列浮点型数据,四舍五入到小数点后三位。

例如,我的 DataGridView 中有一个数字 10.000,但是当我将它导出到 excel 时,它只导出 10 而不是 10.000。

我正在使用以下代码导出数据

Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();


            // creating new WorkBook within Excel application
            Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);


            // creating new Excelsheet in workbook
            Microsoft.Office.Interop.Excel._Worksheet indexWorkSheet = null;
            indexWorkSheet = workbook.Sheets[1];
            // changing the name of active sheet
            indexWorkSheet.Name = "Index Summary";

            indexWorkSheet.get_Range("A1").Style.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
            indexWorkSheet.get_Range("A10", "A30").Style.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
            string filelocation;
            SaveFileDialog SaveFile = new SaveFileDialog();
            if (SaveFile.ShowDialog() == DialogResult.OK)
            {
                filelocation = SaveFile.FileName;



                for (int i = 1; i < dataGridViewIndex.Columns.Count + 1; i++)
                {
                    indexWorkSheet.Cells[9, i + 3] = dataGridViewIndex.Columns[i - 1].HeaderCell.Value;
                }

                for (int i = 1; i < dataGridViewIndex.Rows.Count + 1; i++)
                {
                    indexWorkSheet.Cells[i + 9, 3] = dataGridViewIndex.Rows[i - 1].HeaderCell.Value;

                }

                for (int i = 0; i < dataGridViewIndex.Rows.Count; i++)
                {
                    for (int j = 0; j < dataGridViewIndex.Columns.Count; j++)
                    {

                        indexWorkSheet.Cells[i + 10, j + 4] = dataGridViewIndex.Rows[i].Cells[j].Value.ToString();
                    }
                }
 workbook.SaveAs(filelocation, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
}

我的 DataGridView 在下面的屏幕截图中

我想以 BBL/Day 和 Avg Price 的形式导出上述数据,无论值是多少,都保留三位小数。

有什么好办法解决这个问题吗?

【问题讨论】:

  • 你试过 Open XML SDK 吗?如果您愿意,我可以使用 Open XML SDK 提供答案以实现此目标
  • 我尝试了 XML,但在导出相同格式的数据时遇到了问题。它只是将所有内容作为文本不考虑它是什么类型。所以,我只是使用互操作
  • 你误解了 .. 无论如何使用 Open XML SDK 生成 Exel 电子表格是可能的 - msdn.microsoft.com/en-us/library/office/… .. 读一读 :) ..

标签: c# excel datagridview


【解决方案1】:

10.00010。 Excel 默认使用“常规”格式,不显示任何尾随零。如果你想在 excel 端格式化数字,你必须明确地这样做。

indexWorkSheet.Cells[i + 10, j + 4] = dataGridViewIndex.Rows[i].Cells[j].Value.ToString();
indexWorkSheet.Cells[i + 10, j + 4].NumberFormat = "#,##0.000";  
// or whatever format is appropriate.

但是我会做出另一项更改:

  • 使用 ranges 而不是 cells。每个单元访问都是一个 COM 调用,它为进程增加了显着的开销。如果您针对它运行了一个不错的配置文件,我敢打赌,您的大部分时间都花在了手机访问上。

将您的数据放入一个数组并在一次调用中设置值(并设置范围的格式):

int[,] data = new int[rows,cols];

... loop
    data[i,j] = value;

var range = indexworksheet.get_Range(...);
range.Value = data;
range.NumberFormat = "#,##0.000"; 

【讨论】:

  • 谢谢,但我希望这种数字格式只用于提到的两列
  • 所以将该条件添加到示例中。重点是在 Excel 端设置数字格式,而不是 C# 端。
【解决方案2】:
               for (int i = 0; i < dataGridViewIndex.Rows.Count; i++)
                    {
                        for (int j = 0; j < dataGridViewIndex.Columns.Count; j++)
                        {
                            int digitcount = 4;
                            indexWorkSheet.Cells[i + 10, j + 4] = dataGridViewIndex.Rows[i].Cells[j].Value.ToString("F"+digitcount);
                        }
                    }   

试试这个来格式化字符串。

【讨论】:

  • 这可行,但我相信它会导致 excel 单元格被格式化为“文本”,这可能不是正确的方法。
  • 正如 d-stanley 所说,维护一个列表(Collections) 以更改数字格式..
猜你喜欢
  • 2021-06-19
  • 1970-01-01
  • 2014-01-28
  • 2016-08-25
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多