Code Bye

C#:请帮忙完善dataGrieView中的数据到Excle代码,急

这段代码可以实现从dataGrieView中的数据到Excle,但是导出后没有列名,请老师们加以完善,谢谢!
 /// <summary>
        /// 导出 dataGrieView中的数据到Excle
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="dgv"></param>  
        public static void ExportExcel(string fileName, DataGridView dgv)
        {
            string saveFileName = "";
            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.DefaultExt = "xls";
            saveDialog.Filter = "Excel文件|*.xls";
            saveDialog.FileName = fileName;
            saveDialog.ShowDialog();
            saveFileName = saveDialog.FileName;
            HSSFWorkbook workbook = new HSSFWorkbook();
            MemoryStream ms = new MemoryStream();
            NPOI.SS.UserModel.ISheet sheet = workbook.CreateSheet("Sheet1");
            int rowCount = dgv.Rows.Count;
            int colCount = dgv.Columns.Count;
            for (int i = 0; i < rowCount; i++)
            {
                NPOI.SS.UserModel.IRow dataRow = sheet.CreateRow(i);
                for (int j = 0; j < colCount; j++)
                {
                    if (dgv.Columns[j].Visible && dgv.Rows[i].Cells[j].Value != null)
                    {
                        NPOI.SS.UserModel.ICell cell = dataRow.CreateCell(j);
                        cell.SetCellValue(dgv.Rows[i].Cells[j].Value.ToString());
                    }
                }
            }
            workbook.Write(ms);
            FileStream file = new FileStream(saveFileName, FileMode.Create);
            workbook.Write(file);
            file.Close();
            workbook = null;
            ms.Close();
            ms.Dispose();
            MessageBox.Show(fileName + " 保存成功", "提示", MessageBoxButtons.OK);
        }
解决方案

30

public static class StaticExtension
{
    /// <summary>
    /// 导出 <see cref="System.Windows.Forms.DataGridView"/> 中的标题及数据到 <paramref name="path"/> 所指定的 Excel 文件中。
    /// </summary>
    /// <param name="dgv">存放数据的 <see cref="System.Windows.Forms.DataGridView"/> 控件。</param>
    /// <param name="path">目标 Excel 文件路径。</param>
    /// <exception cref="ArgumentNullException"/>
    public static void ToExcel(this System.Windows.Forms.DataGridView dgv, string path)
    {
        if (string.IsNullOrWhiteSpace(path))
            throw new ArgumentException();
        Excel.Application xls;
        Excel.Workbook wb;
        Excel.Worksheet sh;
        Excel.Range rg;
        xls = new Excel.Application();
        xls.SheetsInNewWorkbook = 1; // 设置建立 Workbook 时的默认 Worksheet 数
        if (xls.Workbooks.Count == 0)
            xls.Workbooks.Add(); // 添加 Workbook
        wb = xls.Workbooks[1];
        sh = (Excel.Worksheet)(wb.Worksheets[1]);
        int cols = dgv.Columns.Count; // 列数
        int rows = dgv.Rows.Count; // 行数 + 标题列
        object[,] arr = new object[rows + 1, cols]; // 定义二维数组 行计数要+1 标题
        for (int i = 0; i < cols; i++)
            arr[0, i] = dgv.Columns[i].HeaderText; // 添加列名
        // 将 DataGridView 中的数据加载到二维数组 arr 中
        for (int i = 0; i < rows; i++)
            for (int j = 0; j < cols; j++)
                arr[i + 1, j] = string.Format("{0}", dgv[j, i].Value);
        rg = sh.Range["A1", sh.Cells[rows + 1, cols]]; // 要填充的目标单元格区域
        rg.Value = arr; // 用 arr 填充目标单元格
        wb.SaveAs(path, FileFormat: Excel.XlFileFormat.xlWorkbookDefault); // 保存
        wb.Close(); // 关闭 Workbook
        xls.Quit();
        sh = null;
        wb = null;
        xls = null;
    }
}

20

引用 10 楼 cangxi_liu 的回复:

您提供的代码导出路径要写死,不能本人选择路径,导出后部分单元格数据(如:170704009808314130248)显示为科学记数了,有没有办法解决?

文件路径没写死啊,可以选择文件以后将文件路径传给 path 参数,例如

var cdlg = new Microsoft.Win32.SaveFileDialog();
// ...
if(cdlg.ShowDialog(this) == DialogResult.OK) // 这是随手写的,记不得返回是什么了
    dgv.ToExcel(cdlg.FileName); // dgv 就是 datagridview

至于数据传递,你可以本人修改 行号 40 哪里
string.Format(“{0}”, dgv[j, i].Value);
例如 if(j == 字符列) string.Format(“”{0}”, dgv[j, i].Value); // 加个单引号作为强制转换
也可以直接对单元格进行样式设置,例如

// 设置格式
rg = sh.Columns["C:C"]; // 获取 C 列
rg.NumberFormatLocal = "@";  // 设置字符串格式
rg = sh.Columns[4]; // 获取 D 列
rg.Font.Color = -16776961; // 设置颜色
rg.Interior.Color = 65535;
rg.Interior.TintAndShade = 0;
rg.Interior.PatternTintAndShade = 0;
rg = sh.Range["A1"]; // 获取 A1 单元格
rg.Borders.ColorIndex = 0; // 设置边框颜色
rg.Borders.Weight = Excel.XlBorderWeight.xlThick; // 边框粗细
rg.Borders.LineStyle = Excel.XlLineStyle.xlContinuous; // 边框样式

有些数值不清楚,可以打开 Excel 录制宏,然后操作一下,进入模块看代码


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#:请帮忙完善dataGrieView中的数据到Excle代码,急