这段代码可以实现从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
文件路径没写死啊,可以选择文件以后将文件路径传给 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 录制宏,然后操作一下,进入模块看代码