大家好,我想把C#中DataGridView的数据导入Excel中,我在Excel选定数据区域进行命名,利用get_range方法获得这个区域并进行赋值。
问题:DataGridView中的数据可能是一行或多行,怎样实现往Excel中写数的时候,Excel随着DataGridView行数的增加自动增加行呢?
不知道说明白没有?我是新手。
我是想实现把C#窗体的数据进行打印,目前想到的办法就是把数据导入Excel中,然后在Excel中进行打印,有没有更好的办法?

解决方案 »

  1.   

    我的做法如下:
                Excel.Range range = workSheet.get_Range("A4", objMissing);
                int rows = this.m_GridView.Rows.Count, cols = this.m_GridView.Columns.Count;
                Excel.Range ranges = range.get_Resize(rows, cols);
                object[,] datas = new object[rows, cols];
                for (int i = 0; i < rows; i++)
                {
                    for (int j = 0; j < cols; j++)
                    {
                        DataGridViewCell cell = this.m_GridView[j, i];                    if (typeof(string) == cell.ValueType)
                        {
                            datas[i, j] = string.Format("'{0}", cell.FormattedValue);
                        }
                        else
                        {
                            datas[i, j] = cell.FormattedValue.ToString();
                        }                }
                }
                ranges.Value = datas;
    至于打印,我的做法是建一个组件,组件中写一个含一个类型为DataGridView的属性,组件中添加PrintDocument组件,给组件写一个Print方法,调用PrintDocument的Print方法(类似的方式实现PrintSetup,PrintPreview等),在PrintDocument的PrintPage中根据DataGridView的Column和Row的内容用GDI+进行绘制.
    这个组件可以封装到一个独立的DLL中,使用时,拖一个到窗体中,然后把它的DataGridView属性设置为要打印的DataGridView,然后调用相应的Print,PrintPreview,PrintSetup方法就可以了,一劳永逸
      

  2.   

    Excel.Application myexcel = new Excel.Application();
    Excel.Workbook mybook = default(Excel.Workbook);
    Excel.Worksheet mysheet = default(Excel.Worksheet);
    mybook = myexcel.Workbooks.Add("ExcelFilename");
    mysheet = mybook.Worksheets("sheet1");
    mysheet.Activate();
    mysheet.Range("A1").Select();
    DataGridView.SelectAll();
    System.Windows.Forms.DataObject t = new System.Windows.Forms.DataObject();
    t = dv.GetClipboardContent();
    System.Windows.Forms.Clipboard.SetDataObject(t);
    mysheet.PasteSpecial(Format = "文本", Link = false, DisplayAsIcon = false);
      

  3.   

    首先谢谢楼上的热心,二楼三楼的方法我都试了,都没有成功。
    二楼的方法没有能实现自动加行。
    三楼的System.Windows.Forms.Clipboard.SetDataObject(t);
    mysheet.PasteSpecial(Format = "文本", Link = false, DisplayAsIcon = false);
    在我运行时提示语法错误,我用的是VS2008。
    还有什么好的对策吗?
      

  4.   

    把EXCEL当成一个数据库来操作试试看呢
    OleDbConnection ExcelConn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=Excel 8.0;");
      

  5.   

    先计算写行数,然后修改命名区域
    假定你的命名区域从第一行,第一列开始
    string fmt = "=Sheet1!R1C1:R{0}C{1}";
                string refersTo = string.Format(fmt, this.dataGridView1.Rows.Count  + 1, this.dataGridView1.Columns.Count + 1);
                exSheet.Names.Add("命名名称",refersTo , true, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing);
      

  6.   

    处理小数据的话可以写到excel,但是我一般都是写到csv中,因为excel最多只能6W5多行。
      

  7.   

    using Excel = Microsoft.Office.Interop.Excel;(并添加引用)
           Excel.Application excel = null;
           Excel.Workbook book = null;//Microsoft Excel 工作簿 
            Excel.Worksheet sheet = null;
           public void SaveDataGireViewtoExcel()
            {
                string pathFileName = string.Empty;
                System.Windows.Forms.SaveFileDialog saveFileDialog = new System.Windows.Forms.SaveFileDialog();
                saveFileDialog.Filter = "Excel File(*.xls)|*.xls";
                saveFileDialog.FilterIndex = 0;
                saveFileDialog.AddExtension = true;
                saveFileDialog.RestoreDirectory = true;
                saveFileDialog.CreatePrompt = false;
                saveFileDialog.Title = "导出到excel:";
                if (saveFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    pathFileName = saveFileDialog.FileName;
                }
                else
                { return; }
                try
                {                excel = new Excel.Application();
                    excel.Visible = false;                book = excel.Workbooks.Add(System.Reflection.Missing.Value);
                    sheet = book.Sheets["sheet1"] as Excel.Worksheet;
                    //生成Excel中列头名称                   all();
                 //   single();
                    //设置禁止弹出保存和覆盖的询问提示框   
                    excel.DisplayAlerts = false;
                    excel.AlertBeforeOverwriting = false;                //保存工作簿   
                    book.Save();
                    //保存excel文件   
                    excel.Save(pathFileName);            }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "错误提示");
                }
                finally
                {
                    //确保Excel进程关闭   
                    if (excel != null)
                        excel.Quit();
                    book = null;
                    sheet = null;
                    
                    int generation = System.GC.GetGeneration(excel);
                    excel = null;
                    System.GC.Collect(generation); 
                }
     
         
             }         public void all()
             {
                 for (int i = 0; i < dataGridView1.Columns.Count; i++)
                 {
                     excel.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText;
                 }
                 //把DataGridView当前页的数据保存在Excel中   
                 for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
                 {
                     for (int j = 0; j < dataGridView1.Columns.Count; j++)
                     {
                         if (dataGridView1[j, i].ValueType == typeof(string))
                         {
                             excel.Cells[i + 2, j + 1] = "'" + dataGridView1[j, i].Value.ToString();
                         }
                         else
                         {
                             excel.Cells[i + 2, j + 1] = dataGridView1[j, i].Value.ToString();
                         }
                     }
                 }
             }
    然后再Button的点击方法里引用SaveDataGireViewtoExcel()就好了
    例如:  private void Button7_Click(object sender, EventArgs e)
             {
                 SaveDataGireViewtoExcel(); 
             }