zoukankan      html  css  js  c++  java
  • C#导出DataGridView到Excel

        public class ExcelHelper
        {
            private static object missing = Type.Missing;
    
            #region ================导出=================
            /// <summary>
            /// 导出到Excel
            /// </summary>
            /// <param name="dgv"></param>
            public static void ExportToExcel(System.Windows.Forms.DataGridView dgv)
            {
                ExportToExcel(dgv, 0, dgv.Columns.Count);
            }
            /// <summary>
            /// 导出到Excel
            /// </summary>
            /// <param name="dgv"></param>
            /// <param name="startColumnIndex">从第几列开始</param>
            public static void ExportToExcel(System.Windows.Forms.DataGridView dgv, int startColumnIndex)
            {
                ExportToExcel(dgv, startColumnIndex, dgv.Columns.Count);
            }
            /// <summary>
            /// 导出到Excel
            /// </summary>
            /// <param name="dgv"></param>
            /// <param name="startColumnIndex">从第几列开始</param>
            /// <param name="endColumnIndex">到第几列结束</param>
            public static void ExportToExcel(System.Windows.Forms.DataGridView dgv, int startColumnIndex, int endColumnIndex)
            {
                if (dgv.Rows.Count == 0)
                    return;
                try
                {
                    Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
                    app.Visible = false;
                    app.UserControl = false;
                    Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Add(missing);
                    Microsoft.Office.Interop.Excel.Worksheet ws = app.ActiveWorkbook.Sheets[1] as Microsoft.Office.Interop.Excel.Worksheet;
                    try
                    {
                        ExportToExcel(app, wb, ws, dgv, startColumnIndex, endColumnIndex);
                    }
                    finally
                    {
                        app.Quit();
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
                        GC.Collect();
                    }
                }
                catch
                {
                    System.Windows.Forms.MessageBox.Show("无法正常启动计算机上的EXCEL软件!", "系统提示", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning);
                }
            }
    
            /// <summary>
            /// 导出到excel
            /// </summary>
            /// <param name="app"></param>
            /// <param name="wb"></param>
            /// <param name="ws"></param>
            /// <param name="dgv"></param>
            /// <param name="startColumnIndex">从第几列开始</param>
            /// <param name="startColumnIndex">到第几列结束</param>
            private static void ExportToExcel(Microsoft.Office.Interop.Excel.Application app, Microsoft.Office.Interop.Excel._Workbook wb, Microsoft.Office.Interop.Excel.Worksheet ws, System.Windows.Forms.DataGridView dgv, int startColumnIndex, int endColumnIndex)
            {
                Microsoft.Office.Interop.Excel.Range range;
                int rowCount = dgv.Rows.Count;
                int colCount = 0;
                int colIndex = 0;
                int rowIndex = 0;
                #region 开始到结束
    
                int startIndex = 0;//开始的列索引
                int endIndex = dgv.Columns.Count;//结束的列索引
                if (endColumnIndex < endIndex)
                    endIndex = endColumnIndex;
                if (startIndex < endIndex && startColumnIndex < endIndex)
                {
                    startIndex = startColumnIndex;
                }
                #endregion
                for (int i = startIndex; i < endIndex; i++)
                {
                    if (!dgv.Columns[i].Visible)
                        continue;
                    colCount++;
                }
                //foreach (DataGridViewColumn col in dgv.Columns)
                //{
                //    if (!col.Visible)
                //        continue;
                //    colCount++;
                //}
                #region "Set title"
                String endCellAddress = "";
                if (colCount > 0 && colCount <= 26)
                {
                    endCellAddress = ((char)('A' + colCount)).ToString() + "1";
                }
                else if (colCount > 26 && colCount < 26 * 26)
                {
                    int iTemp = (int)Math.Ceiling((double)colCount / (double)26);
                    endCellAddress = ((char)('A' + iTemp)).ToString() + ((char)('A' + (colCount - 26 * 26))).ToString() + "1";
                }
                else
                {
                    throw new Exception("列数太多,操作出错!");
                }
                ws.Cells[1, 1] = "导出数据";
                range = ws.get_Range("A1", endCellAddress);
                range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
                range.Font.Size = 20;
                range.Font.Name = "黑体";
                range.Borders.LineStyle = 1;
                range.Select();
                range.Merge(false);
                //range.Merge(ws.get_Range("A1", endCellAddress));
                #endregion "Set title"
    
                #region " Set Header Values "
                object[,] colValues = new object[1, colCount + 1];
                colIndex = 0;
                colValues[0, colIndex] = "序号";
                for (int i = startIndex; i < endIndex; i++)
                {
                    if (!dgv.Columns[i].Visible)
                        continue;
                    colValues[0, colIndex + 1] = dgv.Columns[i].HeaderText;
                    colIndex++;
                }
                //foreach (DataGridViewColumn col in dgv.Columns)
                //{
                //    if (!col.Visible)
                //        continue;
                //    colValues[0, colIndex + 1] = col.HeaderText;
                //    colIndex++;
                //}
    
                range = ws.get_Range(GetExcelCellName(1, 2), GetExcelCellName(colCount + 1, 2));
                range.Value2 = colValues;
                #endregion
    
                #region " Header Style "
                range.Font.Bold = true;
                range.Font.Name = "Georgia";
                range.Font.Size = 10;
                range.RowHeight = 26;
                range.EntireColumn.AutoFit();
                #endregion
    
                #region " Set Row Values "
                object[,] rowValues = new object[rowCount, colCount + 1];
                rowIndex = 0;
                foreach (System.Windows.Forms.DataGridViewRow row in dgv.Rows)
                {
                    colIndex = 0;
                    rowValues[rowIndex, colIndex] = rowIndex + 1;
                    foreach (System.Windows.Forms.DataGridViewCell cell in row.Cells)
                    {
                        if (cell.ColumnIndex == 0)
                        {
                            colIndex++;
                            continue;
                        }
                        if (row.Cells[colIndex].Value.ToString().IsInt())
                            rowValues[row.Index, colIndex] = string.Format("'{0}", row.Cells[colIndex].Value.ToString());
                        else
                            rowValues[row.Index, colIndex] = row.Cells[colIndex].Value.ToString();
                        colIndex++;
                    }
                    rowIndex++;
                }
    
                range = ws.get_Range(GetExcelCellName(1, 3), GetExcelCellName(colCount + 1, rowCount + 2));
                range.Value2 = rowValues;
                #endregion
    
                #region " Row Style "
                range.Font.Name = "Georgia";
                range.Font.Size = 9;
                range.RowHeight = 18;
                range.EntireColumn.AutoFit();
                range.Borders.ColorIndex = 2;
                #endregion
    
                #region " Set Borders "
                range = ws.get_Range(GetExcelCellName(1, 1), GetExcelCellName(colCount + 1, rowCount + 2));
                range.VerticalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;
                range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
                range.Borders.Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;
                range.Borders.Color = System.Drawing.Color.Black.ToArgb();
                #endregion
            }
    
            #region " GetCellName "
    
            private static string GetExcelCellName(int fColIndex, int fRowIndex)
            {
                if (fColIndex <= 0 || fColIndex > 256)
                {
                    throw new Exception("Excel 列索引数值超出范围(1-256)!");
                }
                else if (fColIndex <= 26)
                {
                    return GetExcelCellName(fColIndex) + fRowIndex.ToString();
                }
                else
                {
                    string retLetter = GetExcelCellName(fColIndex / 26);
                    retLetter += GetExcelCellName(fColIndex % 26);
                    retLetter += fRowIndex.ToString();
                    return retLetter;
                }
            }
    
            private static string GetExcelCellName(int fColIndex)
            {
                int i = 1;
                foreach (string letter in Enum.GetNames(typeof(ExcelColumnLetters)))
                {
                    if (i == fColIndex)
                        return letter;
                    i++;
                }
                throw new Exception("Excel 列索引数值超出范围(1-256)!");
            }
    
            #endregion
    
            public enum ExcelColumnLetters
            {
                A = 1,
                B = 2,
                C = 3,
                D = 4,
                E = 5,
                F = 6,
                G = 7,
                H = 8,
                I = 9,
                J = 10,
                K = 11,
                L = 12,
                M = 13,
                N = 14,
                O = 15,
                P = 16,
                Q = 17,
                R = 18,
                S = 19,
                T = 20,
                U = 21,
                V = 22,
                W = 23,
                X = 24,
                Y = 25,
                Z = 26
            }
            #endregion
    
        }
    View Code
  • 相关阅读:
    收藏篇基础命令
    itchat+图灵机器人实现python登录微信并自动回复
    四级物理实验
    天行数据网易云热评接口python脚本模板运行出错||socket.gaierror: [Errno 11001] getaddrinfo failed
    每日一道: 两数之和 简单
    每日一道:求和
    每日一道:四数之和
    每日一道:最接近的三数之和
    每日一道:盛最多水的容器
    MySQL中GRANT和IDENTIFIED同时使用时出现near 'IDENTIFIED BY...” at line 1错误
  • 原文地址:https://www.cnblogs.com/bingle/p/3156580.html
Copyright © 2011-2022 走看看