大家好,我想把C#中DataGridView的数据导入Excel中,我在Excel选定数据区域进行命名,利用get_range方法获得这个区域并进行赋值。
问题:DataGridView中的数据可能是一行或多行,怎样实现往Excel中写数的时候,Excel随着DataGridView行数的增加自动增加行呢?
不知道说明白没有?我是新手。
我是想实现把C#窗体的数据进行打印,目前想到的办法就是把数据导入Excel中,然后在Excel中进行打印,有没有更好的办法?
问题:DataGridView中的数据可能是一行或多行,怎样实现往Excel中写数的时候,Excel随着DataGridView行数的增加自动增加行呢?
不知道说明白没有?我是新手。
我是想实现把C#窗体的数据进行打印,目前想到的办法就是把数据导入Excel中,然后在Excel中进行打印,有没有更好的办法?
Excel.Range range = workSheet.get_Range("A4", objMissing);
int rows = this.m_GridView.Rows.Count, cols = this.m_GridView.Columns.Count;
Excel.Range ranges = range.get_Resize(rows, cols);
object[,] datas = new object[rows, cols];
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
DataGridViewCell cell = this.m_GridView[j, i]; if (typeof(string) == cell.ValueType)
{
datas[i, j] = string.Format("'{0}", cell.FormattedValue);
}
else
{
datas[i, j] = cell.FormattedValue.ToString();
} }
}
ranges.Value = datas;
至于打印,我的做法是建一个组件,组件中写一个含一个类型为DataGridView的属性,组件中添加PrintDocument组件,给组件写一个Print方法,调用PrintDocument的Print方法(类似的方式实现PrintSetup,PrintPreview等),在PrintDocument的PrintPage中根据DataGridView的Column和Row的内容用GDI+进行绘制.
这个组件可以封装到一个独立的DLL中,使用时,拖一个到窗体中,然后把它的DataGridView属性设置为要打印的DataGridView,然后调用相应的Print,PrintPreview,PrintSetup方法就可以了,一劳永逸
Excel.Workbook mybook = default(Excel.Workbook);
Excel.Worksheet mysheet = default(Excel.Worksheet);
mybook = myexcel.Workbooks.Add("ExcelFilename");
mysheet = mybook.Worksheets("sheet1");
mysheet.Activate();
mysheet.Range("A1").Select();
DataGridView.SelectAll();
System.Windows.Forms.DataObject t = new System.Windows.Forms.DataObject();
t = dv.GetClipboardContent();
System.Windows.Forms.Clipboard.SetDataObject(t);
mysheet.PasteSpecial(Format = "文本", Link = false, DisplayAsIcon = false);
二楼的方法没有能实现自动加行。
三楼的System.Windows.Forms.Clipboard.SetDataObject(t);
mysheet.PasteSpecial(Format = "文本", Link = false, DisplayAsIcon = false);
在我运行时提示语法错误,我用的是VS2008。
还有什么好的对策吗?
OleDbConnection ExcelConn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=Excel 8.0;");
假定你的命名区域从第一行,第一列开始
string fmt = "=Sheet1!R1C1:R{0}C{1}";
string refersTo = string.Format(fmt, this.dataGridView1.Rows.Count + 1, this.dataGridView1.Columns.Count + 1);
exSheet.Names.Add("命名名称",refersTo , true, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing, objMissing);
Excel.Application excel = null;
Excel.Workbook book = null;//Microsoft Excel 工作簿
Excel.Worksheet sheet = null;
public void SaveDataGireViewtoExcel()
{
string pathFileName = string.Empty;
System.Windows.Forms.SaveFileDialog saveFileDialog = new System.Windows.Forms.SaveFileDialog();
saveFileDialog.Filter = "Excel File(*.xls)|*.xls";
saveFileDialog.FilterIndex = 0;
saveFileDialog.AddExtension = true;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.CreatePrompt = false;
saveFileDialog.Title = "导出到excel:";
if (saveFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
pathFileName = saveFileDialog.FileName;
}
else
{ return; }
try
{ excel = new Excel.Application();
excel.Visible = false; book = excel.Workbooks.Add(System.Reflection.Missing.Value);
sheet = book.Sheets["sheet1"] as Excel.Worksheet;
//生成Excel中列头名称 all();
// single();
//设置禁止弹出保存和覆盖的询问提示框
excel.DisplayAlerts = false;
excel.AlertBeforeOverwriting = false; //保存工作簿
book.Save();
//保存excel文件
excel.Save(pathFileName); }
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误提示");
}
finally
{
//确保Excel进程关闭
if (excel != null)
excel.Quit();
book = null;
sheet = null;
int generation = System.GC.GetGeneration(excel);
excel = null;
System.GC.Collect(generation);
}
} public void all()
{
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
excel.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText;
}
//把DataGridView当前页的数据保存在Excel中
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
if (dataGridView1[j, i].ValueType == typeof(string))
{
excel.Cells[i + 2, j + 1] = "'" + dataGridView1[j, i].Value.ToString();
}
else
{
excel.Cells[i + 2, j + 1] = dataGridView1[j, i].Value.ToString();
}
}
}
}
然后再Button的点击方法里引用SaveDataGireViewtoExcel()就好了
例如: private void Button7_Click(object sender, EventArgs e)
{
SaveDataGireViewtoExcel();
}