c# 将sql表内容导出到Excel

Wesley 2008-09-25 04:07:05
我做了一个winform现在希望通过点击按钮把sql里指定表(手动指定要如何设计?)的数据导出到Excel。
还有一个是点击把datagridview里面的数据导出到excel怎么写,还请大家指点一下~
...全文
423 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xu_119 2009-08-17
  • 打赏
  • 举报
回复
up
hanghangz 2008-10-10
  • 打赏
  • 举报
回复
不要沉,上去
etindex 2008-10-10
  • 打赏
  • 举报
回复
关于在Sheet中插入一行的过程中我遇到了问题,插入一行的格式总是不对。
看了这个贴我的问题解决了,修改代码如下:

Range.EntireRow.Insert(0, XlDirection.xlDown);


非常感谢!
gongkexin 2008-09-26
  • 打赏
  • 举报
回复
mark
zt_100094 2008-09-26
  • 打赏
  • 举报
回复
我的BLOG里又源码
wxm3630478 2008-09-25
  • 打赏
  • 举报
回复
找到原因了 用楼的方法 某一列的数据如果有换行的话,导出的数据就会变乱........
wxm3630478 2008-09-25
  • 打赏
  • 举报
回复
1楼的代码不觉的有问题吗??
for (int j = 0; j < dgvAgeWeekSex.Rows.Count; j++)
{..........}

要改成for (int j = 0; j < dgvAgeWeekSex.Rows.Count-1; j++)


我现在也是用的1楼的数据流方法,恩会郁闷死,以前没发现,最近才知道.....数据比较正规的话没啥问题,但是数据比较乱,里面有一些乱七八糟的符号的话,就会出问题,导出3000行,它给我出了3000多行,一看里面有的正常,有的数据全乱了.....

现在正在找新方法了:用这个在查询分析器上没问题,放到C#就是不行,也不报错
EXEC master..xp_cmdshell 'bcp "select * from test.dbo.LS_Tab" queryout C:\Excel.xls -c -S192.168.1.100 -Usa -Psa' 


帮顶...............期待高人.
gaocumt 2008-09-25
  • 打赏
  • 举报
回复
mark
wxm3630478 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dyshadow 的回复:]
引用 8 楼 wxm3630478 的回复:
用这个语句在查询分析器上可以:

SQL code


EXEC master..xp_cmdshell 'bcp "select * from test.dbo.LS_Tab" queryout C:\Excel.xls -c -S192.168.1.100 -Usa -Psa'


不知道怎么搬到C#中就没用了.........不知道为什么


这个也可以用的,去掉EXEC直接master..xp_cmdshell .................. 就可以了
[/Quote]

你试过没,我怎么不行了..................
dyshadow 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wxm3630478 的回复:]
用这个语句在查询分析器上可以:

SQL code


EXEC master..xp_cmdshell 'bcp "select * from test.dbo.LS_Tab" queryout C:\Excel.xls -c -S192.168.1.100 -Usa -Psa'




不知道怎么搬到C#中就没用了.........不知道为什么
[/Quote]

这个也可以用的,去掉EXEC直接master..xp_cmdshell .................. 就可以了
wxm3630478 2008-09-25
  • 打赏
  • 举报
回复
用这个语句在查询分析器上可以:
EXEC master..xp_cmdshell 'bcp "select * from test.dbo.LS_Tab" queryout C:\Excel.xls -c -S192.168.1.100 -Usa -Psa' 


不知道怎么搬到C#中就没用了.........不知道为什么
qinhl99 2008-09-25
  • 打赏
  • 举报
回复
netbor 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wjq 的回复:]
1楼的方法是按文本方式写,老版本的xls可能会不认
[/Quote]

基本都能使用,98的好像很少见了.
netbor 2008-09-25
  • 打赏
  • 举报
回复
楼上的要用引用OFFICE,有很大的版问题,引的哪个版就只能导入哪个版本的EXCEL,不灵活,还是用流通用性强.
xxj1985 2008-09-25
  • 打赏
  • 举报
回复
private void button1_Click(object sender, EventArgs e)
{
string pathName = System.Windows.Forms.Application.StartupPath.Trim();
string dateTime = txtdatatime.Text.Split(char.Parse("-"))[0] + "年" + txtdatatime.Text.Split(char.Parse("-"))[1] + "月";

int count = 0;
FileInfo mode = new FileInfo(pathName + "\\model\\Name.xls");
try
{
mode.CopyTo(pathName + "\\temp\\" + dateTime + " 产品名称.xls", true);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
object ming = Type.Missing;
Excel.Application myExcel = new Microsoft.Office.Interop.Excel.Application();
myExcel.Application.Workbooks.Open(pathName + "\\temp\\" + dateTime + " 产品名称.xls", ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming);
myExcel.Visible = false;

Excel.Workbook myBook = myExcel.Workbooks[1];
Excel.Worksheet mySheet = (Excel.Worksheet)myBook.Worksheets[1];

databind();

try
{
if (ds.Tables.Contains("tblClass"))//如果有这个表就把改表的内容清空
{
ds.Tables["tblClass"].Clear();
}
da.Fill(ds, "tblClass");
count = ds.Tables["tblClass"].Rows.Count;//表中的数据的总行数
dataGridView1.DataSource = ds.Tables["tblClass"];

if (count == 0)
{
MessageBox.Show("没有可打印的数据!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
myExcel.Cells[2, 3] = dateTime;//显示时间的位置

for (int i = 0; i < count; i++)
{
((Excel.Range)mySheet.Cells[i + 3, 1]).EntireRow.Insert(0, Excel.XlDirection.xlDown); //添加行

mySheet.Cells[i + 3, 1] = ds.Tables["tblClass"].Rows[i][0].ToString();
mySheet.Cells[i + 3, 2] = ds.Tables["tblClass"].Rows[i][1].ToString();
}
}
Excel.Range r = mySheet.get_Range(mySheet.Cells[3, 1], mySheet.Cells[2 + count, 2]);
r.Select();
myExcel.Run("Macro1",ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming, ming);
myBook.Save();
myExcel.Visible = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
if (myBook != null)
{
myBook.Close(false, ming, ming);
}
myExcel.Workbooks.Close();
myExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);
}
finally
{
da.Dispose();
}
}



你可以根据情况来改
wjq 2008-09-25
  • 打赏
  • 举报
回复
1楼的方法是按文本方式写,老版本的xls可能会不认
wjq 2008-09-25
  • 打赏
  • 举报
回复
用oledb连接你的excel(需要事先创建一个模板,即带有标题列)
把sql server的数据读到datatable或者reader里,循环结果集,拼insert sql语句来写入xls文件.
最后把连接关掉
dgv也一样,如果数据源是dataset或者datatable就如上炮制,要么就循环dgv的rows,然后还是取每个cell的值来拼sql
netbor 2008-09-25
  • 打赏
  • 举报
回复

private void SaveAs(DataGridView dgvAgeWeekSex)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Execl 97-2003 (*.xls)|*.xls|Execl 2007 (*.xlsx)|*.xlsx";
saveFileDialog.FilterIndex = 0;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.CreatePrompt = true;
saveFileDialog.Title = "Netbor Export Dialog";
saveFileDialog.ShowDialog();
Stream myStream;
myStream = saveFileDialog.OpenFile();
StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));
string str = "";
try
{
for (int i = 0; i < dgvAgeWeekSex.ColumnCount; i++)
{
if (i > 0)
{
str += "\t";
}
str += dgvAgeWeekSex.Columns[i].HeaderText;
}
sw.WriteLine(str);
for (int j = 0; j < dgvAgeWeekSex.Rows.Count; j++)
{
string tempStr = "";
for (int k = 0; k < dgvAgeWeekSex.Columns.Count; k++)
{
if (k > 0)
{
tempStr += "\t";
}
tempStr += dgvAgeWeekSex.Rows[j].Cells[k].Value.ToString();
}
sw.WriteLine(tempStr);
}
sw.Close();
myStream.Close();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
finally
{
sw.Close();
myStream.Close();
}
}

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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