首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 求用户不装excel也能用的 winForm 的 DataGridView 导出 Excel 方法 [已结贴,结贴人:TryToday]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • TryToday
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-20 17:36:37 楼主
    如题,搜索到一些代码,许多用dataSet,控制哪些列不导出不如 dataGridView 方便。

    而且我需要用户不安装excel也能用的办法,发布需要哪些dll也请说明。

    求源码,谢谢!
    30  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • whoami333
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 09:58:001楼 得分:0
    用oledb方式可以不用安装excel,但是只能导出最简单的格式。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • whoami333
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 10:05:562楼 得分:5
    using (OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strDestPath + ";Extended Properties=\"Excel 8.0;HDR=YES;\""))
                    {
                        con.Open();
                        string strCity = "", strCmd = "";
                        OleDbCommand cmd = new OleDbCommand();
                        cmd.Connection = con;
                        while ((strLine = sr.ReadLine()) != null)
                        {
                            strLine = Regex.Replace(strLine, "\"", "");
                            try
                            {
                                string[] AstrL = strLine.Split(',');
                                if (strCity != AstrL[0])
                                {
                                    strCity = AstrL[0];
                                    strCmd = "create table " + strCity + " (";
                                    foreach (string str1 in Astr) strCmd += str1 + " char(255),";
                                    strCmd = strCmd.TrimEnd(new char[] { ',' });
                                    strCmd += ")";
                                    //MessageBox.Show(strCmd); break;
                                    cmd.CommandText = strCmd;
                                    cmd.ExecuteNonQuery();
                                    strCmd = "insert into " + strCity + " values(";
                                    foreach (string str1 in AstrL) strCmd += "'" + str1 + "',";
                                    strCmd = strCmd.TrimEnd(new char[] { ',' });
                                    strCmd += ")";
                                    cmd.CommandText = strCmd;
                                    cmd.ExecuteNonQuery();
                                }
                                else
                                {
                                    strCmd = "insert into " + strCity + " values(";
                                    foreach (string str1 in AstrL) strCmd += "'" + str1 + "',";
                                    strCmd = strCmd.TrimEnd(new char[] { ',' });
                                    strCmd += ")";
                                    cmd.CommandText = strCmd;
                                    cmd.ExecuteNonQuery();
                                }
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show(strCmd + ex.Message);
                                break;
                            }
                        }
                    }

    上面是一个把文本文件导出到excel的多个worksheet的例子,你可以参考以下。datagridview也可以用这种方式。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sl2161
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 10:50:153楼 得分:15
    提供三个思路
    一、ado.net
    使用ado.net,导出的格式你用excel先定义好
    比如你要到处一个表列1,列2,列3
    在excel表格中的A1,B1,C1单元格中分别输入列1,列2,列3

    导出时复制该excel文件到你想保存的位置,再建立ole连接,使用ado.net进行导出

    该方法速度快,但不灵活(导出的格式需要事先定义好),并且不需要用户安装excel

    二、利用office与.net的互操作
    引用dll,office.dll,Microsoft.Vbe.Interop.dll,Microsoft.Office.Interop.Excel.dll,可以使用更加灵活控制导出dll的方法

    三、利用第三方组件componentOne
    可以到veryCd上面下载破解版的,http://www.verycd.com/topics/180684/
    那个上面的trueDbgrid控件可以直接进行excel导出,只需要调用方法ExportToExcel,这个最省事,呵呵
    它还有方法ExportToHTML,ExportToPDF,ExportToRTF顺便导


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • clxcxx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 10:54:244楼 得分:0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • TryToday
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 11:55:505楼 得分:0
    问一下:sl2161

    你说的第二种引用dll的方式,软件发布的时候需要加入这些dll吗?放在当前目录可以吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sl2161
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 13:06:266楼 得分:0
    开发的机器上要安装office的完整版,你要熟练的话在安装office时候点选里面的.net编程支持也是一样
    软件发布的时候需要那些dll,打包会自动打进去的,实际上安装的过程相当于在客户端安装了一个精简版的excel,那些dll和你的exe文件是在一个目录下面的
    但是这个速度奇慢,我测试过导出1W条记录,用ado.net只要0.3秒,用利用office与.net的互操作花了10秒,视机器不同结果不一样

    推荐使用方法三,利用第三方组件
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jietuan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 16:31:347楼 得分:0
    你添加对excel.dll的引用
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Zeteyu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 16:38:528楼 得分:10
    C# code
    /// <summary> /// 将SQLServer中的数据导出到Excel(使用OleDB) /// </summary> /// <param name="ExelDt">要导出的数据集</param> /// <param name="filePath">输出到的文件目录</param> /// <returns>信息</returns> public static string SQLServerToExcel(System.Data.DataTable ExelDt, string filePath) { if (ExelDt == null) { return "数据不能为空"; } //数据集的行总数、列总数 int rows = ExelDt.Rows.Count; int cols = ExelDt.Columns.Count; if (rows == 0) { return "没有数据"; } StringBuilder sb = new StringBuilder(); string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + filePath + ";Extended Properties=Excel 8.0"; OleDbCommand cmd = new OleDbCommand(); OleDbConnection myConn = new OleDbConnection(strCon); try { //创建文件 myConn.Open(); //创建表 cmd.Connection = myConn; sb.Append("create table "); sb.Append(ExelDt.TableName + "("); for (int i = 0; i < cols; i++) { if (i < cols - 1) { sb.Append(string.Format("{0} varchar,", ExelDt.Columns[i].ColumnName)); } else { sb.Append(string.Format("{0} varchar)", ExelDt.Columns[i].ColumnName)); } } cmd.CommandText = sb.ToString(); cmd.ExecuteNonQuery(); } catch (Exception ex) { return "建立Exel文件失败:" + ex.ToString(); } //--------------------------------------------------------------------------------- //插入数据 sb.Remove(0, sb.Length); sb.Append("INSERT INTO "); sb.Append(ExelDt.TableName + " ( "); for (int i = 0; i < cols; i++) { if (i < cols - 1) sb.Append(ExelDt.Columns[i].ColumnName + ","); else sb.Append(ExelDt.Columns[i].ColumnName + ") values ("); } for (int i = 0; i < cols; i++) { if (i < cols - 1) sb.Append("@" + ExelDt.Columns[i].ColumnName + ","); else sb.Append("@" + ExelDt.Columns[i].ColumnName + ")"); } cmd.CommandText = sb.ToString(); OleDbParameterCollection param = cmd.Parameters; for (int i = 0; i < cols; i++) { param.Add(new OleDbParameter("@" + ExelDt.Columns[i].ColumnName, OleDbType.VarChar)); } //遍历DataTable将数据插入新建的Excel文件中 foreach (DataRow row in ExelDt.Rows) { for (int i = 0; i < param.Count; i++) { param[i].Value = row[i]; } cmd.ExecuteNonQuery(); } cmd.Connection.Close(); return "数据已成功导入Excel"; }


    第一种方法是使用OLEDB
    还有一种方法是用HTML的Tabel标签
    这个具体我没试过实现,这里给个思路,将要导出的数据用 <tabel>、 <tr>、 <td>这几个标签输出成HTML文件,然后把扩展名改为.xls就可以。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jinjazz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

    发表于:2008-08-21 16:40:439楼 得分:0
    http://blog.csdn.net/jinjazz/archive/2008/08/04/2766203.aspx
    http://blog.csdn.net/jinjazz/archive/2008/08/01/2753869.aspx
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • shilei831115
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 16:44:3410楼 得分:0
       
    用GemBox.ExcelLite.dll吧,这个组件去搜索一下,用法如下:


                ExcelFile excelFile = new ExcelFile();
                ExcelWorksheet sheet = excelFile.Worksheets.Add("WolfSpider");

                int columns = dataGridView1.Columns.Count;
                int rows = dataGridView1.Rows.Count;

                for (int j = 0; j < columns;j++ )
                {
                    sheet.Cells[0, j].Value = dataGridView1.Columns[j].HeaderText;
                }
               
                for (int i = 1; i <= rows; i++)
                {
                    for (int j = 0; j < columns; j++)
                    {
                        sheet.Cells[i, j].Value = dataGridView1[j, i-1].Value;
                    }
                }

                excelFile.SaveXls("./WolfSpider.xls");//保存位置
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved