天天看点

DataGridView控件导出到Excel文件

主要用了2种方式来实现。

1.格式不做限制,普通列表显示

      /// <summary>   

     /// 常用方法,列之间加\t,一行一行输出,此文件其实是csv文件,不过默认可以当成Excel打开。   

     /// </summary>   

     /// <remarks>   

     /// using System.IO;   

     /// </remarks>   

     /// <param name="dgv"></param>   

     private void DataGridViewToExcel(DataGridView dgv)

      {

         SaveFileDialog dlg = new SaveFileDialog();

         dlg.Filter = "Execl files (*.xls)|*.xls";

         dlg.FilterIndex = 0;

         dlg.RestoreDirectory = true;

         dlg.CreatePrompt = true;

         dlg.Title = "保存为Excel文件";

         if (dlg.ShowDialog() == DialogResult.OK)

          {

             Stream myStream;

             myStream = dlg.OpenFile();

             StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));

             string columnTitle = "";

             try

              {

                 //写入列标题   

                 for (int i = 0; i < dgv.ColumnCount; i++)

                  {

                     if (i > 0)

                      {

                         columnTitle += "\t";

                     }

                     columnTitle += dgv.Columns[i].HeaderText;

                 }

                 sw.WriteLine(columnTitle);

                 //写入列内容   

                 for (int j = 0; j < dgv.Rows.Count; j++)

                  {

                     string columnValue = "";

                     for (int k = 0; k < dgv.Columns.Count; k++)

                      {

                         if (k > 0)

                          {

                             columnValue += "\t";

                         }

                         if (dgv.Rows[j].Cells[k].Value == null)

                             columnValue += "";

                         else

                             columnValue += dgv.Rows[j].Cells[k].Value.ToString().Trim();

                     }

                     sw.WriteLine(columnValue);

                 }

                 sw.Close();

                 myStream.Close();

             }

             catch (Exception e)

              {

                 MessageBox.Show(e.ToString());

             }

             finally

              {

                 sw.Close();

                 myStream.Close();

             }

         }

     }

对于复杂的,对于导出的excel有格式限制,可以考虑用Excel模板(XML支持)来实现。 

 /// <summary>

        /// 将DataGridView中的数据导入到Excel中

        /// </summary>

        /// <param name="dt">DataGridView</param>

        /// <param name="templatePath">模板的路径</param>

        /// <param name="excelName">导入Excel的路径</param>

        /// <returns></returns>

        public static bool DataGridViewToExcel(DataGridView dg, string templatePath, string excelName)

        {

            bool result = true;

            XmlDocument xmlDoc = new XmlDocument();

            if (File.Exists(templatePath))

            {

                xmlDoc.Load(templatePath);

                XmlNode root = xmlDoc.SelectSingleNode(@"/*[local-name()='Workbook']/*[local-name()='Worksheet'][1]/*[local-name()='Table']");

                foreach (DataGridViewRow dgRow in dg.Rows)

                {

                    XmlElement row = xmlDoc.CreateElement("", "Row", "urn:schemas-microsoft-com:office:spreadsheet");

                    row.SetAttribute("AutoFitHeight", "urn:schemas-microsoft-com:office:spreadsheet", "0");

                    foreach (DataGridViewColumn dgcol in dg.Columns)

                    {

                        if (dgcol.Visible && dgcol.IsDataBound && dgcol.GetType().Name == "DataGridViewTextBoxColumn")

                        {

                            XmlElement cell = xmlDoc.CreateElement("", "Cell", "urn:schemas-microsoft-com:office:spreadsheet");

                            XmlElement data = xmlDoc.CreateElement("", "Data", "urn:schemas-microsoft-com:office:spreadsheet");

                            data.SetAttribute("Type", "urn:schemas-microsoft-com:office:spreadsheet", "String");

                            data.InnerText = StringUility.ReturnFormatString(dgRow.Cells[dgcol.Name].Value);

                            cell.AppendChild(data);

                            row.AppendChild(cell);

                        }

                    }

                    //root.InsertBefore(row, root.LastChild);

                    root.AppendChild(row);

                }

                #region 添加合计行

                XmlElement totalRow = xmlDoc.CreateElement("", "Row", "urn:schemas-microsoft-com:office:spreadsheet");

                totalRow.SetAttribute("AutoFitHeight", "urn:schemas-microsoft-com:office:spreadsheet", "0");

                for (int i = 0; i < 2; i++)

                {

                    XmlElement cell = xmlDoc.CreateElement("", "Cell", "urn:schemas-microsoft-com:office:spreadsheet");

                    XmlElement data = xmlDoc.CreateElement("", "Data", "urn:schemas-microsoft-com:office:spreadsheet");

                    data.SetAttribute("Type", "urn:schemas-microsoft-com:office:spreadsheet", i == 0 ? "String" : "Number");

                    data.InnerText =(i==0?"合计":dg.Rows.Count.ToString());

                    cell.AppendChild(data);

                    totalRow.AppendChild(cell);

                }

                root.AppendChild(totalRow);

                #endregion

                XmlNode countnode = xmlDoc.SelectSingleNode(@"/*[local-name()='Workbook']/*[local-name()='Worksheet'][1]/*[local-name()='Table']");

                countnode.Attributes["ss:ExpandedRowCount"].Value = (Int32.Parse(countnode.Attributes["ss:ExpandedRowCount"].Value) + dg.Rows.Count+1).ToString();//标题+合计+数据

                xmlDoc.Save(excelName);

                result = true;

            }

            else

            {

                result = false;

            }

            return result;

        }

另外还有通过Microsoft Excel 11.0(12) Object Library,使用using Excel=Microsoft.Office.Interop.Excel调用CoM来实现。但必须有要求是安装该软件的应用程序必须装Microsoft Office Excel才行。而且还应该设置运行该软件的程序对COM有访问权限。

继续阅读