健康一贴灵,专注医药行业管理信息化

Winform程序中将datagridview导出到excel (推荐)

使用DEEPSEEK推荐的导出方法,好的很!

用前要用nuget 安装 ClosedXML 插件包

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ClosedXML.Excel;
namespace drp.Common
{
    public class ExcelIO
    {



        public void ExportWithClosedXML(DataGridView dgv)
        {
            using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "Excel Files|*.xlsx" })
            {
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    using (XLWorkbook wb = new XLWorkbook())
                    {
                        var ws = wb.Worksheets.Add("Sheet1");

                        // 导出列头
                        for (int i = 0; i < dgv.Columns.Count; i++)
                        {
                            // 使用 SetValue 方法避免类型错误
                            ws.Cell(1, i + 1).SetValue(dgv.Columns[i].HeaderText);
                        }

                        // 导出数据
                        for (int i = 0; i < dgv.Rows.Count; i++)
                        {
                            // 跳过新行(如果允许添加行)
                            if (dgv.Rows[i].IsNewRow) continue;

                            for (int j = 0; j < dgv.Columns.Count; j++)
                            {
                                var cellValue = dgv.Rows[i].Cells[j].Value;

                                // 处理空值
                                if (cellValue == null || cellValue == DBNull.Value)
                                {
                                    ws.Cell(i + 2, j + 1).SetValue(string.Empty);
                                }
                                else
                                {
                                    // 根据数据类型设置值
                                    if (dgv.Columns[j].ValueType == typeof(DateTime))
                                    {
                                        ws.Cell(i + 2, j + 1).SetValue((DateTime)cellValue);
                                        ws.Cell(i + 2, j + 1).Style.DateFormat.Format = "yyyy-mm-dd";
                                    }
                                    else if (IsNumericType(dgv.Columns[j].ValueType))
                                    {
                                        ws.Cell(i + 2, j + 1).SetValue(Convert.ToDouble(cellValue));
                                    }
                                    else
                                    {
                                        ws.Cell(i + 2, j + 1).SetValue(cellValue.ToString());
                                    }
                                }
                            }
                        }

                        for (int i = 0; i < dgv.Columns.Count; i++)
                        {
                            // 获取DataGridView列的宽度(像素)
                            int colWidth = dgv.Columns[i].Width;

                            // 计算Excel列宽
                            double excelWidth = (colWidth / 7.0) + 1;

                            // 设置最小和最大宽度限制
                            if (excelWidth < 2) excelWidth = 2;
                            if (excelWidth > 50) excelWidth = 50;

                            // 设置Excel列宽
                            ws.Column(i + 1).Width = excelWidth;

                            // 如果内容比列宽更宽,则自动调整列宽
                            if (ws.Column(i + 1).Width < ws.Column(i + 1).CellsUsed().Max(c => c.Value.ToString().Length) * 0.8)
                            {
                                ws.Column(i + 1).AdjustToContents();
                            }
                        }
                        // 自动调整列宽
                        ws.Columns().AdjustToContents();
                        wb.SaveAs(sfd.FileName);
                    }
                    MessageBox.Show("导出成功!");
                }
            }
        }

        public void ExportToExcel(DataGridView dgv)
        {
            using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "Excel Files|*.xlsx" })
            {
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    using (XLWorkbook wb = new XLWorkbook())
                    {
                        var ws = wb.Worksheets.Add("Sheet1");

                        // 创建数据表
                        var dataTable = new System.Data.DataTable();

                        // 添加列头
                        foreach (DataGridViewColumn column in dgv.Columns)
                        {
                            dataTable.Columns.Add(column.HeaderText);
                        }

                        // 添加数据行
                        foreach (DataGridViewRow row in dgv.Rows)
                        {
                            if (row.IsNewRow) continue;

                            var dataRow = dataTable.NewRow();
                            foreach (DataGridViewCell cell in row.Cells)
                            {
                                dataRow[cell.ColumnIndex] = cell.Value ?? DBNull.Value;
                            }
                            dataTable.Rows.Add(dataRow);
                        }

                        // 批量插入数据(从第一行第一列开始)
                        ws.Cell(1, 1).InsertTable(dataTable);

                        // 设置列宽
                        for (int i = 0; i < dgv.Columns.Count; i++)
                        {
                            // 获取DataGridView列的宽度(像素)
                            int colWidth = dgv.Columns[i].Width;

                            // 计算Excel列宽
                            double excelWidth = (colWidth / 7.0) + 1;

                            // 设置最小和最大宽度限制
                            if (excelWidth < 2) excelWidth = 2;
                            if (excelWidth > 50) excelWidth = 50;

                            // 设置Excel列宽
                            ws.Column(i + 1).Width = excelWidth;

                            // 如果内容比列宽更宽,则自动调整列宽
                            if (ws.Column(i + 1).Width < ws.Column(i + 1).CellsUsed().Max(c => c.Value.ToString().Length) * 0.8)
                            {
                                ws.Column(i + 1).AdjustToContents();
                            }
                        }

                        wb.SaveAs(sfd.FileName);
                    }
                    MessageBox.Show("导出成功!");
                }
            }
        }

        public void Export(DataGridView dgv)
        {
            using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "Excel Files|*.xlsx" })
            {
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    using (XLWorkbook wb = new XLWorkbook())
                    {
                        var ws = wb.Worksheets.Add("Sheet1");

                        // 创建数据表
                        var dataTable = new DataTable();

                        // 添加列头并设置数据类型
                        foreach (DataGridViewColumn column in dgv.Columns)
                        {
                            // 使用DataGridView列的数据类型(如果可用)
                            Type dataType = column.ValueType ?? typeof(object);
                            dataTable.Columns.Add(column.HeaderText, dataType);
                        }

                        // 添加数据行
                        foreach (DataGridViewRow row in dgv.Rows)
                        {
                            if (row.IsNewRow) continue;

                            var dataRow = dataTable.NewRow();
                            foreach (DataGridViewCell cell in row.Cells)
                            {
                                if (cell.Value == null || cell.Value == DBNull.Value)
                                {
                                    // 根据列的数据类型设置默认值
                                    if (dataTable.Columns[cell.ColumnIndex].DataType == typeof(string))
                                    {
                                        dataRow[cell.ColumnIndex] = "";
                                    }
                                    else if (IsNumericType(dataTable.Columns[cell.ColumnIndex].DataType))
                                    {
                                        dataRow[cell.ColumnIndex] = 0;
                                    }
                                    else
                                    {
                                        dataRow[cell.ColumnIndex] = DBNull.Value;
                                    }
                                }
                                else
                                {
                                    dataRow[cell.ColumnIndex] = cell.Value;
                                }
                            }
                            dataTable.Rows.Add(dataRow);
                        }

                        // 批量插入数据(从第一行第一列开始)
                        var tableRange = ws.Cell(1, 1).InsertTable(dataTable);

                        // 设置列宽
                        for (int i = 0; i < dgv.Columns.Count; i++)
                        {
                            int colWidth = dgv.Columns[i].Width;
                            double excelWidth = (colWidth / 7.0) + 1;
                            if (excelWidth < 2) excelWidth = 2;
                            if (excelWidth > 50) excelWidth = 50;
                            ws.Column(i + 1).Width = excelWidth;
                        }

                        // 关键:设置数值列的格式为数字
                        for (int i = 0; i < dgv.Columns.Count; i++)
                        {
                            if (IsNumericType(dataTable.Columns[i].DataType))
                            {
                                // 设置整列为数字格式
                                ws.Column(i + 1).Style.NumberFormat.Format = "#,##0.00";

                                // 对于整数类型,去掉小数部分
                                if (dataTable.Columns[i].DataType == typeof(int) ||
                                    dataTable.Columns[i].DataType == typeof(long))
                                {
                                    ws.Column(i + 1).Style.NumberFormat.Format = "#,##0";
                                }
                            }
                        }

                        wb.SaveAs(sfd.FileName);
                    }
                    MessageBox.Show("导出成功!");
                }
            }
        }

        // 辅助方法:检查是否为数值类型
        private bool IsNumericType(Type type)
        {
            switch (Type.GetTypeCode(type))
            {
                case TypeCode.Byte:
                case TypeCode.SByte:
                case TypeCode.UInt16:
                case TypeCode.UInt32:
                case TypeCode.UInt64:
                case TypeCode.Int16:
                case TypeCode.Int32:
                case TypeCode.Int64:
                case TypeCode.Decimal:
                case TypeCode.Double:
                case TypeCode.Single:
                    return true;
                default:
                    return false;
            }
        }
    }
}

 

posted @ 2025-09-26 16:44  一贴灵  阅读(28)  评论(0)    收藏  举报
学以致用,效率第一