小弟在网上搜索了一大把DataTable数据导入excel例子,也实现了该功能,但是有个问题小问题始终未能解决,就是某列
的数字类型太长,比如身份证号,在excel里显示就是指数类型,请问这个如何修改
   代码如下:
  
 private static bool ExportExcel()
        {
            if (saveFileName.IndexOf(":") < 0) return false; //被点了取消            Excel.Application xlApp = new Excel.Application();
            object missing = System.Reflection.Missing.Value;            if (xlApp == null)
            {
                MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");
                return false;
            }
            Excel.Workbooks workbooks = xlApp.Workbooks;
            Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
            Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];    //取得sheet1
            Excel.Range range;            string strCaption = saveFileName.Remove(0, saveFileName.LastIndexOf('\\') + 1);
            strCaption = strCaption.Remove(strCaption.Length - 4, 4);            long totalCount = dtDataSource.Rows.Count;
            long rowRead = 0;
            float percent = 0;
            range = (Excel.Range)worksheet.get_Range(worksheet.Cells[1, 1],
                worksheet.Cells[2, dtDataSource.Columns.Count]);                    //标题占用前两行
            range.Merge(missing);                                                   //合并
            range.Font.Bold = true;                                                 //粗体设置
            range.Font.Size = 16;                                                   //字体大小设置 
            range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;              //水平对齐设置 
            range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;                //垂直对齐设置
            //range.FormulaR1C1 = 公式;             //公式设置
            //range.ColumnWidth = 宽度;             //列宽设置
            //range.RowHeight = 行高;               //行高  
            worksheet.Cells[1, 1] = strCaption;            //写入字段
            for (int i = 0; i < dtDataSource.Columns.Count; i++)
            {
                worksheet.Cells[4, i + 1] = dtDataSource.Columns[i].ColumnName;
                range = (Excel.Range)worksheet.Cells[4, i + 1];
                range.Interior.ColorIndex = 15;
                range.Font.Bold = true;
            }            //写入数值
            for (int r = 0; r < dtDataSource.Rows.Count; r++)
            {
                for (int i = 0; i < dtDataSource.Columns.Count; i++)
                {
                    worksheet.Cells[r + 5, i + 1] = dtDataSource.Rows[r][i];
                }
                rowRead++;
                percent = ((float)(100 * rowRead)) / totalCount;
                Application.DoEvents();
            }
            worksheet.SaveAs(saveFileName, missing, missing, missing, missing, missing, missing, missing, missing, missing);            range = worksheet.get_Range(worksheet.Cells[4, 1],
                worksheet.Cells[dtDataSource.Rows.Count + 4, dtDataSource.Columns.Count]);
            range.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, null);
            range.NumberFormat = "@"; //这句话是我在上面搜索到的,可惜不起作用
            range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic;
            range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Excel.XlLineStyle.xlContinuous;
            range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].Weight = Excel.XlBorderWeight.xlThin;            if (dtDataSource.Columns.Count > 1)
            {
                range.Borders[Excel.XlBordersIndex.xlInsideVertical].ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic;
            }
            workbook.Close(missing, missing, missing);
            xlApp.Quit();            return true;
        }
  急用,解决马上给分

解决方案 »

  1.   

    处理一下dataTable 将身份证列转换成字符串,加个单引号con.Add(StringExtensions.TreatString("'" + item.证劵代码));
      

  2.   

    一个简单办法:在execel输入数据之前,把身份证那列的单元格属性设为:“文本”,数据将以字符串方式出现,你看到和获取都将是完整的身份证的字符串!
      

  3.   

    不好意思,说错了,那个身份证字段本来就是varchar类型的
      

  4.   

    不是把你的DataTable 身份证 换成字符串
    而是把你要导出到EXCEL 的range 的身份证那一列 换成 字符串 
      

  5.   


    wSheet.get_Range(excel.Cells[1, 1], excel.Cells[dtDataSource.Rows.Count + 1, dtDataSource.Columns.Count - 1]).NumberFormatLocal = "@"; //设置为文本
    写在 worksheet.SaveAs(saveFileName, missing, missing, missing, missing, missing, missing, missing, miss……………………之后。
      

  6.   


    //将datagridview导出到excel ,和LZ的意思是一个意思 将datagridview转换成datatable就OK了
            public void Exportdatagridviewtoexcel(DataGridView mydgv)
            {
                if (mydgv.Rows.Count == 0)
                {
                    MessageBox.Show(" 没有数据可供导出!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
                else
                {
                    SaveFileDialog savedialog = new SaveFileDialog();
                    savedialog.DefaultExt = "xlsx";
                    savedialog.Filter = "microsoft office execl files (*.xlsx)|*.xlsx";
                    savedialog.FilterIndex = 0;
                    savedialog.RestoreDirectory = true;
                    savedialog.Title = "导出数据到excel表格";
                    savedialog.ShowDialog();
                    if (savedialog.FileName.IndexOf(":") < 0) return; //被点了取消  
                    //Microsoft.office.interop.excel.application xlapp = new microsoft.office.interop.excel.application();
                    Microsoft.Office.Interop.Excel.Application xlapp = new Microsoft.Office.Interop.Excel.Application();
                    if (xlapp == null)
                    {
                        MessageBox.Show("可能您的机子未安装excel,无法创建excel对象!", "系统提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }                Microsoft.Office.Interop.Excel.Workbooks workbooks = xlapp.Workbooks;
                    Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
                    Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1  
                    //定义表格内数据的行数和列数   
                    int rowscount = mydgv.Rows.Count;
                    int colscount = mydgv.Columns.Count;
                    //行数不可以大于65536   
                    if (rowscount > 65536)
                    {
                        MessageBox.Show("数据行记录超过65536行,不能保存!", "系统提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }
                    //列数不可以大于255   
                    if (colscount > 256)
                    {
                        MessageBox.Show("数据列记录超过256列,不能保存!", "系统提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }
                    //写入标题
                    for (int i = 0; i < mydgv.ColumnCount; i++)
                    {
                        worksheet.Cells[1, i + 1] = mydgv.Columns[i].HeaderText;
                    }
                    //写入数值
                    for (int r = 0; r < mydgv.Rows.Count; r++)
                    {
                        for (int i = 0; i < mydgv.ColumnCount; i++)
                        {
                            if (mydgv[i, r].ValueType == typeof(string))
                            {
                                worksheet.Cells[r + 2, i + 1] = "" + mydgv.Rows[r].Cells[i].Value;//将长数值转换成文本
                            }
                            else
                            {
                                worksheet.Cells[r + 2, i + 1] = mydgv.Rows[r].Cells[i].Value;
                            }
                        }
                        System.Windows.Forms.Application.DoEvents();
                    }
                    worksheet.Columns.EntireColumn.AutoFit();//列宽自适应
                    if (savedialog.FileName != "")
                    {
                        try
                        {
                            workbook.Saved = true;
                            workbook.SaveCopyAs(savedialog.FileName);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("导出文件时出错,文件可能正被打开!..." + ex.Message, "系统提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    //GC.Collect();//强行销毁  
                    MessageBox.Show("数据导出成功! ", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
      

  7.   

    这个问题很好解决,你可以设置一个Excel的模板,把模板中的“身份证”这一列设置成文本,就在excel里控制。 如果别人或者你自己需要导入Excel,就先下载这个模板,并填写好,然后导入你填写好的这个模板,导进去的就是最原始的身份证号,其他通过代码什么转换的都是浮云,因为我试过很多次了,根本没有用
      

  8.   

    这个问题很好解决,你可以设置一个Excel的模板,把模板中的“身份证”这一列设置成文本,就在excel里控制。 如果别人或者你自己需要导入Excel,就先下载这个模板,并填写好,然后导入你填写好的这个模板,导进去的就是最原始的身份证号,其他通过代码什么转换的都是浮云,因为我试过很多次了,根本没有用