首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

winform 导出Excell少了两行,弄了一天了,没找到原因

2013-04-09 
winform 导出Excell少了两行,弄了一天了,没找到原因,求助 public static void DataTableToExcel(System.Da

winform 导出Excell少了两行,弄了一天了,没找到原因,求助

 public static void DataTableToExcel(System.Data.DataTable dt, string saveFileName)
        {
            try
            {
                if (dt == null) return;
                //-***************获取excel对象***************
                //  string saveFileName = "";
                TimeSpan dateBegin = new TimeSpan(DateTime.Now.Ticks);
                bool fileSaved = false;
                SaveFileDialog saveDialog = new SaveFileDialog();
                saveDialog.DefaultExt = "xls";
                saveDialog.Filter = "Excel文件|*.xls";
                saveDialog.FileName = saveFileName+"数据导出结果 " + DateTime.Today.ToString("yyyy-MM-dd");
                saveDialog.ShowDialog();
                saveFileName = saveDialog.FileName;
                if (saveFileName.IndexOf(":") < 0) return; //被点了取消            
                Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
                if (xlApp == null)
                {
                    MessageBox.Show("无法启动Excel,可能您未安装Excel");
                    return;
                }
                Microsoft.Office.Interop.Excel.Workbook workbook = xlApp.Workbooks.Add(true);
                Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
                Microsoft.Office.Interop.Excel.Range range;


                // string oldCaption = dt.CaptionText;
                // 列索引,行索引,总列数,总行数                   


                int colIndex = 0;
                int RowIndex = 0;
                int colCount = dt.Columns.Count;
                int RowCount = dt.Rows.Count;


                // *****************获取数据*********************
                //dataGrid1.CaptionVisible = true;
                //dataGrid1.CaptionText = "正在导出数据";
                // 创建缓存数据
                object[,] objData = new object[RowCount + 1, colCount];
                // 获取列标题
                for (int i = 0; i < dt.Columns.Count; i++)
                {                 
                    objData[RowIndex, colIndex++] = dt.Columns[i].Caption; // dgv.Columns[i].HeaderText;
                }
                worksheet.Cells.NumberFormat = "#";
                // 获取具体数据
                for (RowIndex = 1; RowIndex <= RowCount; RowIndex++)
                {
                    for (colIndex = 0; colIndex < colCount; colIndex++)
                    {                      
                        //object obj = dt.Rows[RowIndex - 1][colIndex];
                        //objData[RowIndex, colIndex] = obj == null ? "" : "'" + obj.ToString().Trim();
                        objData[RowIndex, colIndex] = dt.Rows[RowIndex - 1][colIndex]; //Z
                    }                   


                }

                //********************* 写入Excel*******************               
                range = worksheet.Range[worksheet.Cells[2, 1], worksheet.Cells[RowCount, colCount]];
                range.NumberFormatLocal = "@";
                //range = worksheet.Range(xlApp.Cells[2, 1], xlApp.Cells[RowCount, colCount]);
                range.Value2 = objData; //我跟踪了下,到这里objData数据显示有三行,但是range.value2只有一行,worksheet.Cells[2, 1] 不知道这个什么意思,试了很多次,还是不行。
                System.Windows.Forms.Application.DoEvents();

                //*******************设置输出格式******************************

                //设置顶部説明   合并的单元格                
                range = worksheet.Range[xlApp.Cells[1, 1], xlApp.Cells[1, colCount]];
                range.NumberFormatLocal = "@";
                range.MergeCells = true;
                range.RowHeight = 38;
                range.Font.Bold = true;
                range.Font.Size = 14;
                range.Font.ColorIndex = 10;//字体颜色
                xlApp.ActiveCell.FormulaR1C1 = "导入记录查询结果";

                //特殊数字格式
                //range = worksheet.get_Range(xlApp.Cells[2, colCount], xlApp.Cells[RowCount, colCount]);
                range = worksheet.Range[xlApp.Cells[2, colCount], xlApp.Cells[RowCount, colCount]];
                range.NumberFormatLocal = "@";
                // range.NumberFormat = "yyyy-MM-dd hh:mm:ss";

                xlApp.Cells.HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter;
                //range = worksheet.get_Range(xlApp.Cells[2, 1], xlApp.Cells[2, colCount]);


                range = worksheet.Range[xlApp.Cells[2, 1], xlApp.Cells[2, colCount]];
                //  range.Interior.ColorIndex = 10;//背景色
                range.Font.Bold = true;
                range.RowHeight = 20;
                //((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[2, 1]).ColumnWidth = 25;
                //((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[2, 2]).ColumnWidth = 13;
                //((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[2, 3]).ColumnWidth = 18;
                //((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[2, 4]).ColumnWidth = 15;
                //((Microsoft.Office.Interop.Excel.Range)worksheet.Cells[2, 5]).ColumnWidth = 22;

                //***************************保存**********************
                //dataGrid1.CaptionVisible = false;
                //dataGrid1.CaptionText = oldCaption;
                if (saveFileName != "")
                {
                    try
                    {
                        workbook.Saved = true;
                        workbook.SaveCopyAs(saveFileName);
                        fileSaved = true;
                    }
                    catch (Exception ex)
                    {
                        fileSaved = false;
                        MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);
                    }
                }


                else
                {
                    fileSaved = false;
                }
                xlApp.Quit();
                GC.Collect();//强行销毁  

                TimeSpan dateEnd = new TimeSpan(DateTime.Now.Ticks);
                TimeSpan tspan = dateBegin.Subtract(dateEnd).Duration();
                MessageBox.Show("导出成功,用时" + tspan.ToString() + "秒");
                if (fileSaved && System.IO.File.Exists(saveFileName))
                    System.Diagnostics.Process.Start(saveFileName); //保存成功后打开此文件
            }
            catch (Exception ex)
            {

                //int a = 0;
            }
        }



range.Value2 = objData; //我跟踪了下,到这里objData数据显示有三行数据,但是range.value2只有两行一行是页眉说明,一行数据行,worksheet.Cells[2, 1] 不知道这个什么意思,试了很多次,还是不行。
是在找不到原因了,这代码也是网上找的。求助。
[解决办法]
worksheet.Cells代表工作表中的所有单元格,所以【2,1】表示第二行,第一列,也就是“A2”这个单元格。
[解决办法]
for (RowIndex = 1; RowIndex <= RowCount; RowIndex++)
RowIndex = 1?自然少1
RowIndex = 0开始,哎虽说抄代码也该读懂代码!

热点排行