2

我有一个用 C# 编写的应用程序,它从 Datagridview 中提取数据到 excel。我的问题是当我导出到 excel 时有一个像 010498 这样的数字变成 10498,而开头没有零 (0)。我希望有零(0)。是否有任何可能的解决方案,无论是在应用程序中用 C# 编写代码还是通过 excel 编写代码?
感谢和抱歉英语不好。

在数据网格视图中

导出到excel后

在第一张图片中似乎是 datagridview 和在第二张图片中导出到 excel 后如何。在单元格 A3、F3、F4 的开头缺少零 (0)。任何解决方案我该如何解决?谢谢。
导出到 Excel 的代码。

private void excel_toolstripmenuitem_Click(object sender, EventArgs e)
    {
        Microsoft.Office.Interop.Excel.Application excelApp = null;
        try
        {
            // instantiating the excel application class
            object misValue = System.Reflection.Missing.Value;
            excelApp = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbook currentWorkbook = excelApp.Workbooks.Add(Type.Missing);
            Microsoft.Office.Interop.Excel.Worksheet currentWorksheet = (Microsoft.Office.Interop.Excel.Worksheet)currentWorkbook.ActiveSheet;
            currentWorksheet.Columns.ColumnWidth = 18;
            if (dg1.Rows.Count > 0)
            {
                currentWorksheet.Cells[1, 1] = DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToShortTimeString();
                int i = 1;
                foreach (DataGridViewColumn dgviewColumn in dg1.Columns)
                {
                    // Excel work sheet indexing starts with 1
                    currentWorksheet.Cells[2, i] = dgviewColumn.Name;
                    ++i;
                }
                Microsoft.Office.Interop.Excel.Range headerColumnRange = currentWorksheet.get_Range("A2", "AY2");
                headerColumnRange.Font.Bold = true;
                headerColumnRange.Font.Color = 0xFF0000;
                int rowIndex = 0;
                for (rowIndex = 0; rowIndex < dg1.Rows.Count; rowIndex++)
                {
                    DataGridViewRow dgRow = dg1.Rows[rowIndex];
                    for (int cellIndex = 0; cellIndex < dgRow.Cells.Count; cellIndex++)
                    {
                        currentWorksheet.Cells[rowIndex + 3, cellIndex + 1] = dgRow.Cells[cellIndex].Value;
                    }
                }
                Microsoft.Office.Interop.Excel.Range fullTextRange = currentWorksheet.get_Range("A1", "AY" + (rowIndex + 1).ToString());
                fullTextRange.WrapText = true;
                fullTextRange.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft;
            }

            using (SaveFileDialog exportSaveFileDialog = new SaveFileDialog())
            {
                exportSaveFileDialog.Title = "Save as";
                exportSaveFileDialog.Filter = "Microsoft Office Excel Workbook(*.xls)|*.xls";

                if (DialogResult.OK == exportSaveFileDialog.ShowDialog())
                {
                    string fullFileName = exportSaveFileDialog.FileName;

                    currentWorkbook.SaveAs(fullFileName, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, System.Reflection.Missing.Value, misValue, false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Microsoft.Office.Interop.Excel.XlSaveConflictResolution.xlUserResolution, true, misValue, misValue, misValue);                      
                    currentWorkbook.Saved = true;
                    MessageBox.Show("The export was successful", "Export to Excel", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        finally
        {
            if (excelApp != null)
            {
                excelApp.Quit();               
                excelApp = null;
            }
        }
    }
4

4 回答 4

3

方式一

currentWorksheet.Cells[rowIndex + 3, cellIndex + 1] = 
"'0" + dgRow.Cells[cellIndex].Value;

方式二

Case 1

我相信您的数据网格单元格可以有不同长度的数字,0001234例如00123. 因此,如果您想保留数据网格中的数字,则不要设置前缀格式,例如0000000. 使用方式 1 或单独格式化单元格。我能想到的另一种方法是将 DG 单元的值存储在int变量中,然后.PadLeft在考虑 DG 单元值的长度后使用。所以像这样的数字0000123的长度为7。但是在int变量中,它将被存储为123(长度 - 3)。您所要做的就是使用.PadLeftwith7-3=4 zeros然后将结果字符串存储在 excel 单元格中。

Case 2

如果您希望所有数字都以相同的长度以某种格式存储,请00000000使用此代码。

//~~> This will format Column 1 with "00000000"
currentWorksheet.Columns[1].NumberFormat = "00000000";

PS:在 Excel 2010 + VS 2010 Ultimate 中测试

于 2013-10-19T20:02:13.587 回答
2
   currentWorksheet.Cells[...] = dgRow.Cells[cellIndex].Value;

我猜这将是您在单元格中输入数字的相关代码行。分配 NumberFormat 属性以强制 Excel 显示额外的前导 0:

   currentWorksheet.Cells[rowIndex + 3, cellIndex + 1].NumberFormat = "000000";

假设您想要“010498”。

于 2013-10-19T20:00:07.127 回答
1

您可以在 Excel 中的数字前加上撇号以保持前导零。

'010498

您仍然可以对带有前导的数字进行算术运算'

如果您知道数字的长度(即,数字总是像您的示例一样是六位数字),那么您还可以使用全 0 的自定义数字格式来格式化单元格(例如000000)。

自定义数字格式

于 2013-10-19T18:04:33.260 回答
1

如果您使用的是 DataTable,则需要获取另一个 DataTable,然后您需要遍历数据表中的整个单元格,并在单元格文本前面加上空格,即使用“ ”;我们不能修改同一个表中的行,因为它会抛出一个异常说“集合已修改”。我们必须采用一个新的数据表。

考虑以下代码。

    //To get the result with leading zero's in excel this code is written.
        DataTable dtUpdated=new DataTable();
        //This gives similar schema to the new datatable
        dtUpdated = dtReports.Clone();
            foreach (DataRow row in dtReports.Rows)
            {
                for (int i = 0; i < dtReports.Columns.Count; i++)
                {
                    string oldVal = row[i].ToString();
                    string newVal = "&nbsp;"+oldVal;
                    row[i] = newVal;
                }
                dtUpdated.ImportRow(row); 
            }

我们可以将此更新后的表格绑定到数据网格,以便它可以用于 Excel 转换。

于 2014-01-16T05:19:04.253 回答