public static void GridviewtoExcel(DataGridView dg, string title)//将Datatable中的数据导出到Excel中
{
if (dg.Rows.Count == 0)
{
MessageBox.Show("无数据", Frmmain.tips, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
string saveFileName = "";
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.DefaultExt = "xls";
saveDialog.Filter = "Excel文件|*.xls";
saveDialog.FileName = title;
saveDialog.ShowDialog();
saveFileName = saveDialog.FileName;
if (saveFileName.IndexOf(":") < 0) return; //被点了取消
Excel.Application xlApp = new Excel.Application();
try
{
object missing = System.Reflection.Missing.Value;
if (xlApp == null)
{
MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel", Frmmain.tips, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
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;
for (int i = 0; i < dg.Columns.Count; i++)
{
if (dg.Columns[i].Visible == false) continue;
worksheet.Cells[1, i + 1] = dg.Columns[i].HeaderText;
range = (Excel.Range)worksheet.Cells[1, i + 1];
range.Font.Bold = true;
}
Excel.Range myrange = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[dg.Rows.Count + 1, 1]);//设置单牌号所在的单元格格式为文本格式
myrange.NumberFormatLocal = "@ ";
for (int r = 0; r < dg.Rows.Count; r++)
{
for (int i = 0; i < dg.Columns.Count; i++)
{
if (dg.Columns[i].Visible == false || dg.Columns[i].CellType.Name == "DataGridViewCheckBoxCell")
{
continue;
}
worksheet.Cells[r + 2, i + 1] = dg.Rows[r].Cells[i].Value.ToString();
}
System.Windows.Forms.Application.DoEvents();
}
worksheet.SaveAs(saveFileName, missing, missing, missing, missing, missing, missing, missing, missing, missing);
workbook.Close(missing, missing, missing);
worksheet = null;
workbook = null;
xlApp.Quit();
xlApp = null;
missing = null; }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
GC.Collect();
}
}
用以上的方法可以把Datagridview中的数据导出到Excel中,但是导出以后内存中还会驻留Excel.exe的进程。帮忙看下到底是哪儿出问题了,又或者有什么好的导出方法。
{
if (dg.Rows.Count == 0)
{
MessageBox.Show("无数据", Frmmain.tips, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
string saveFileName = "";
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.DefaultExt = "xls";
saveDialog.Filter = "Excel文件|*.xls";
saveDialog.FileName = title;
saveDialog.ShowDialog();
saveFileName = saveDialog.FileName;
if (saveFileName.IndexOf(":") < 0) return; //被点了取消
Excel.Application xlApp = new Excel.Application();
try
{
object missing = System.Reflection.Missing.Value;
if (xlApp == null)
{
MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel", Frmmain.tips, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
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;
for (int i = 0; i < dg.Columns.Count; i++)
{
if (dg.Columns[i].Visible == false) continue;
worksheet.Cells[1, i + 1] = dg.Columns[i].HeaderText;
range = (Excel.Range)worksheet.Cells[1, i + 1];
range.Font.Bold = true;
}
Excel.Range myrange = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[dg.Rows.Count + 1, 1]);//设置单牌号所在的单元格格式为文本格式
myrange.NumberFormatLocal = "@ ";
for (int r = 0; r < dg.Rows.Count; r++)
{
for (int i = 0; i < dg.Columns.Count; i++)
{
if (dg.Columns[i].Visible == false || dg.Columns[i].CellType.Name == "DataGridViewCheckBoxCell")
{
continue;
}
worksheet.Cells[r + 2, i + 1] = dg.Rows[r].Cells[i].Value.ToString();
}
System.Windows.Forms.Application.DoEvents();
}
worksheet.SaveAs(saveFileName, missing, missing, missing, missing, missing, missing, missing, missing, missing);
workbook.Close(missing, missing, missing);
worksheet = null;
workbook = null;
xlApp.Quit();
xlApp = null;
missing = null; }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
GC.Collect();
}
}
用以上的方法可以把Datagridview中的数据导出到Excel中,但是导出以后内存中还会驻留Excel.exe的进程。帮忙看下到底是哪儿出问题了,又或者有什么好的导出方法。
解决方案 »
- 向各位高手请教啊!!!
- 有没有简单的方式实现在appSettings放一个集合?
- msiexec.exe作为卸载程序,卸载不完全,有残留文件,求解决方案
- 关于value ...
- 有用C# 做POST模拟上传的吗
- HTTP Error 403.1 - Forbidden: Execute access is denied.请问该如何解决
- 大家看看代码错在哪里?————非常“菜”的错误
- 如果用C#调用oracle的package?C#可以执行动态SQL
- 求助:能否在DataGrid里的设置一个新列(此列为一个下拉框,用于超连),如何实现!?
- BETA2里如果想override一个event应该怎么写?
- 如何在静态的DLL回调函数里面访问主界面?
- 用C#做的软件,请大家给点建议
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
xlApp = null;
}
using (FileStream fileStream = new FileStream(filePath, FileMode.OpenOrCreate))
{
using (StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.Unicode))
{
StringBuilder rowWriter = new StringBuilder(); rowWriter.Append("姓名\t性别\t年龄\n");
foreach (DataSetView.UserRow row in dt.Rows)
{
rowWriter.Append(row.UserName).Append("\t");
rowWriter.Append(row.UserSex.ToString()).Append("\t");
rowWriter.Append(row.UserAge.ToString()).Append("\n");
} streamWriter.Write(rowWriter.ToString());
}
}
这样不需要安装office excel也可以导出来.