c#dataGridView导出EXCEL

mingming8915 2011-09-13 01:00:01

//设置自适应列宽
private static void SetColumnFit(Microsoft.Office.Interop.Excel.Worksheet sheet, int iColCount)
{
char column = 'B';
for (int i = 0; i < iColCount; i++)
{
Microsoft.Office.Interop.Excel.Range range = sheet.get_Range(String.Format("{0}1", column.ToString()),
String.Format("{0}1", column.ToString()));
if (range != null)
{
range.EntireColumn.AutoFit();
}
column++;
}

}

//设置适应页宽
private static void SetPagetoFitWide(Microsoft.Office.Interop.Excel.Worksheet ws)
{
ws.PageSetup.Zoom = false;
ws.PageSetup.FitToPagesWide = 1;
ws.PageSetup.FitToPagesTall = false;
}
//导出指定列,各列名以逗号分开
public static bool DataGridToExcel(DataGridView myDataGridView, string sColumns, string excelFileName, bool openFile)
{
if (myDataGridView.RowCount == 0 || string.IsNullOrEmpty(sColumns.Trim()))
{
return false;
}

string[] sColAry = sColumns.Split(',');

// 创建Excel对象
Microsoft.Office.Interop.Excel._Application xlApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
if (xlApp == null)
{
MessageBox.Show("Excel无法启动,可能是您未安装Excel软件");
return false;
}
// 创建Excel工作薄
Microsoft.Office.Interop.Excel.Workbook xlBook = xlApp.Workbooks.Add(true);
Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets[1];

Microsoft.Office.Interop.Excel.Range range = xlSheet.get_Range(xlApp.Cells[1, 1], xlApp.Cells[1, myDataGridView.ColumnCount]);
// 列索引,行索引,总列数,总行数
int colIndex = 0;
int rowIndex = 0;
int colCount = sColAry.Length;
// int colCount = 20;
int rowCount = myDataGridView.RowCount + 1;
// 创建缓存数据
object[,] objData = new object[rowCount + 1, colCount];
// 获取列标题
for (int i = 0; i < sColAry.Length; i++)
{
objData[rowIndex, colIndex++] = myDataGridView.Columns[sColAry[i]].HeaderText;
}

// 获取数据
for (rowIndex = 1; rowIndex < rowCount; rowIndex++)
{
for (colIndex = 0; colIndex < colCount; colIndex++)
{
objData[rowIndex, colIndex] = myDataGridView.Rows[rowIndex - 1].Cells[sColAry[colIndex]].Value.ToString();
}
System.Windows.Forms.Application.DoEvents();
}
//设置单元格格式
xlSheet.Cells.NumberFormatLocal = "@";

// 写入Excel
range = xlSheet.get_Range(xlApp.Cells[1, 1], xlApp.Cells[rowCount + 1, colCount]);
range.Value2 = objData;
//自适应列宽
SetColumnFit(xlSheet, colCount);
//适应页宽
//SetPagetoFitWide(xlSheet);
// 保存
try
{
SaveFileDialog Dlg = new SaveFileDialog();
Dlg.DefaultExt = "xls";
Dlg.Filter = "Excel文件(*.xls)|*.xls";
Dlg.InitialDirectory = Directory.GetCurrentDirectory();
if (Dlg.ShowDialog() == DialogResult.Cancel) return false;
string filenameString = Dlg.FileName;
if (filenameString.Trim() == "") return false;
FileInfo file = new FileInfo(filenameString);
if (file.Exists)
{
try
{
file.Delete();
}
catch (Exception erro)
{
MessageBox.Show(erro.Message, "删除失败", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
}

xlBook.Saved = true;
if (xlApp.Version == "12.0")
xlBook.SaveCopyAs(filenameString);
else
xlBook.SaveCopyAs(filenameString);

if (openFile)
{
if (xlApp.Version == "12.0")
System.Diagnostics.Process.Start("Excel", "\"" + @filenameString + "\"");
else
System.Diagnostics.Process.Start("Excel", "\"" + @filenameString + "\"");
}
return true;
}
catch
{
MessageBox.Show("保存出错,请检查!");
return false;
}
finally
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook.Worksheets);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(range);

xlSheet = null;
range = null;
xlApp.Quit();
xlApp = null;
GC.Collect();//垃圾回收
}
}
public static void getExcelName(DataGridView dgv)
{
string dgvColumns = "";
for (int i = 0; i < dgv.ColumnCount; i++)
{
if (dgv.Columns[i].Visible == true)
{
dgvColumns += dgv.Columns[i].Name;
dgvColumns += ",";
}
}
dgvColumns = dgvColumns.Substring(0, dgvColumns.Length - 1);
DataAccess.DataGridToExcel(dgv, dgvColumns, "", true);
}


...全文
221 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
mingming8915 2011-09-15
  • 打赏
  • 举报
回复
range 相当于控制的一个对象,可操作对象的相关属性~
mingming8915 2011-09-13
  • 打赏
  • 举报
回复
这是写的用dataGridView导出EXCEL的语句 现在我直接调取getExcelName()方法传入dataGridView
现在需要添加两个功能
1.需在表中增加表头,表头可用变量传入,表头需要在第一行,并合并所有的列单元格居中,可设置格式

字体
还有列头需要加黑变粗,如果导出的数据是数字类型让其默认为数字类型
2.在存储的EXCEL的是否 如何指定一个固定的目录~
希望高手求帮~

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧