这段代码可以实现从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 录制宏,然后操作一下,进入模块看代码