winform DataTable数据导入excel
小弟在网上搜索了一大把DataTable数据导入excel例子,也实现了该功能,但是有个问题小问题始终未能解决,就是某列
的数字类型太长,比如身份证号,在excel里显示就是指数类型,请问这个如何修改
代码如下:
- C# code
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; }
急用,解决马上给分
[解决办法]
一个简单办法:在execel输入数据之前,把身份证那列的单元格属性设为:“文本”,数据将以字符串方式出现,你看到和获取都将是完整的身份证的字符串!
[解决办法]
不是把你的DataTable 身份证 换成字符串
而是把你要导出到EXCEL 的range 的身份证那一列 换成 字符串
[解决办法]
- C# code
wSheet.get_Range(excel.Cells[1, 1], excel.Cells[dtDataSource.Rows.Count + 1, dtDataSource.Columns.Count - 1]).NumberFormatLocal = "@"; //设置为文本
[解决办法]
- C# code
//将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); }