需要将Gridview1框导出到Excel

giasone777

活跃的成员
已加入
2019年7月19日
留言内容
29
编程经验
1-3
我有一个使用ASP.net文本框和ASP.net GridView1的网页。我正在使用C#将SQL数据放入asp框,其中之一是GridView1框。

在网页上,有几个按钮可以提取VMware对象信息,然后将信息发送到gridview。我想要做的是有另一个按钮,它将信息从GridView1发送到Excel文件。

我搜索的所有示例都没有奏效-请帮忙,请参见下面的c#代码示例-谢谢-Jason。

确定将其删除。
 
Last edited:

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
快来Jason来吧...您背后有10条帖子,它表明您有足够长的时间知道在将代码发布到论坛时应该使用代码标签按钮...。
 

giasone777

活跃的成员
已加入
2019年7月19日
留言内容
29
编程经验
1-3
在这里-再次感谢。
C#:
var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlconnection"].ConnectionString);
connection.Open();
var command = new SqlCommand();
var query = new StringBuilder("SELECT db_owner.vms.name AS 'Vm Name', db_owner.vms.vmhost AS 'ESX Host', db_owner.host.Cluster, db_owner.vms.UID AS 'vCenter', db_owner.vms.PowerState AS 'Powered             ON/OFF', db_owner.vms.Guest AS 'Operating System'  FROM db_owner.vms JOIN db_owner.host ON db_owner.vms.VMHost = db_owner.host.Name");
var selectedIndices = objectList.GetSelectedIndices();
switch (selectedIndices.Length)
{
    case 0:
        break;
    case 1:
        query.Append(" WHERE vmhost LIKE @vmhost");
        command.Parameters.Add("@vmhost", SqlDbType.VarChar, 50).Value = $"%{objectList.SelectedItem.Text}%";
        break;
    default:
        for (var i = 0; i < selectedIndices.Length; i++)
        {
            var index = selectedIndices[i];
            //   var paramName = $"@UID";

            var paramName = $"@vmhost{index}";

            query.Append($" {(i == 0 ? "Where" : "OR")} VMHOST LIKE {paramName}");
            command.Parameters.Add(paramName, SqlDbType.VarChar, 50).Value = $"%{objectList.Items[index].Text}%";
        }
        break;
}
query.Append("  order by db_owner.host.Cluster ");
command.CommandText = query.ToString();
command.Connection = connection;
SqlDataReader dr = command.ExecuteReader();
GridView1.DataSource = dr;
GridView1.DataBind();
 
由主持人最后编辑:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,509
地点
悉尼,澳大利亚
编程经验
10+
I'm always amazed at the number people who think that it's a good idea to cut the leading whitespace of the first line of their code but leave it on the rest. Neither is a good idea. You can hold down the Alt key while selecting code in VS to remove whitespace from the whole block or the editor in this site will do it for you too. ALWAYS think about what you can do to help us help you, which includes making your code as readable as possible. I have fixed it for you on this occasion.
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,509
地点
悉尼,澳大利亚
编程经验
10+
我搜索的所有示例都没有用
您需要向我们展示认为应该可以实现您想要做的事情的代码,以便我们可以看到这样做可能有什么问题。
 

giasone777

活跃的成员
已加入
2019年7月19日
留言内容
29
编程经验
1-3
我会记住有关空白的提示-谢谢-Jason。

我以以下内容为例,但不起作用-
C#:
System.IO.StringWriter sw = new System.IO.StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
Response.AddHeader("content-disposition", "attachment; filename=" + strFileName);
Response.ClearContent();

Response.AddHeader("content-disposition", attachment);

dr.RenderControl(htw);
Response.Write(sw.ToString());
Response.Flush();
Response.End();
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,505
地点
弗吉尼亚州切萨皮克
编程经验
10+
什么? dr in post #3 is an SqlDataReader. That doesn't have a RenderControl() method. What is dr in post #6 such that it has an RenderControl() method? Again, as stated above, you need to give us enough code to see what you are doing.

无论如何,当您要将ASP.NET控件的内容写入文件,然后让用户下载该文件时,就有一种方法。如果要让用户下载Excel文件,那不是您想要的。

第一个问题是您的用户确实需要一个Excel文件还是仅一个.CSV文件?

如果只是.CSV文件,那么事情会容易得多。如果是Excel文件,则需要Excel 2003及更低版本的.XLS文件,还是可以使用更新的.XLSX文件?在这两种情况下,如果您可以找到一个库来逐行构建电子表格,将更加容易。

如果您需要.XLS,请不要尝试在Web服务器上使用办公室自动化。尽管您尝试使用它时似乎可以使用,但不支持它。此外,安装Office时违反了Microsoft EULA。这将使您头疼,并导致操作人员在Web服务器开始表现得非常好并且每天需要重新启动几次时,用火把和干草叉将您从床上赶走。搜索各种付费或免费库,以生成.XLS文件。

如果需要.XLSX,则可以深入研究OpenXML文档,并弄清楚如何编写电子表格。如果您有时间和爱好,它是可行的。不过,我仍然建议您寻找付费或免费图书馆来为您完成这项工作。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,505
地点
弗吉尼亚州切萨皮克
编程经验
10+
Building a .CSV is easy. Instead of your call to dr.RenderControl() above you would simply have something like this pseudo-code:
C#:
sw.WriteLine("Column1Name, Column2Name, Column3Name");
foreach(var row in rowData)
{
    line = string.Format("{0}, {1}, {2}", row[0], row[1], row[2]);
    sw.WriteLine(line);
}
基本上首先输出标头行和列名。然后在那之后输出每一行。
You can get very fancy with using string interpolation and String.Join() to minimize the amount of code written, but what I should above is to show you things in the simplest way possible.
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,509
地点
悉尼,澳大利亚
编程经验
10+
我只需要一个.csv文件
如果您实际上要实现的目标是写入CSV文件,那么直到发布#8才需要您告诉我们。编写好的论坛问题并不难,但是太多的人试图尽可能简短,并且似乎以为我们知道他们的头脑和项目中的内容。我们只知道您告诉我们的内容,因此您必须告诉我们所有与之相关的内容,并尝试尽可能少地掩盖它。一个好的问题应该采取以下形式"这正是我要实现的目标,这正是我要实现的目标(包括相关代码),这就是我尝试时所发生的情况(包括错误消息及其发生的位置)".
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,509
地点
悉尼,澳大利亚
编程经验
10+
Building a .CSV is easy. Instead of your call to dr.RenderControl() above you would simply have something like this pseudo-code:
C#:
sw.WriteLine("Column1Name, Column2Name, Column3Name");
foreach(var row in rowData)
{
    line = string.Format("{0}, {1}, {2}", row[0], row[1], row[2]);
    sw.WriteLine(line);
}
基本上首先输出标头行和列名。然后在那之后输出每一行。
You can get very fancy with using string interpolation and String.Join() to minimize the amount of code written, but what I should above is to show you things in the simplest way possible.
One thing to keep in mind is that that code assumes that none of the data contains field or line delimiters. If that is or might be the case then you need to quote the field values, which also means that you need to escape quotes. In that case, string.Join is a good option:
C#:
line = @"""" + string.Join(@""",""", row.Select(f => f.ToString().Replace(@"""", @""""""))) + @"""";
这看起来有点疯狂,但是它基本上是获取每个字段值,用两个双引号替换每个双引号,并在每个对之间将它们与一个双引号,一个逗号和另一个双引号组合在一起,然后在前面加上另一个双引号。引用。如果从这些值开始:
他进入,然后说"Hello" to me
那么您最终会得到以下结果:
"100","他进入,然后说""Hello"" to me","999"
 

giasone777

活跃的成员
已加入
2019年7月19日
留言内容
29
编程经验
1-3
问题是每个按钮的列都有不同的名称,它们不是静态的,每个按钮都拉出不同的查询-选择,名称为AS'Vm Name',vmhost其中的名称类似于'%name%',因此每个按钮将具有它自己的列名。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,505
地点
弗吉尼亚州切萨皮克
编程经验
10+
And how is that an issue? Here's more pseudo-code when using a SqlDataReader as the data source:
C#:
var names = new List<string>();
for(int i = 0; i < dataReader.FieldCount; i++)
    names.Add(dataReader.GetName(i));
writer.WriteLine(string.Join(", ", names));

while (dataReader.Read())
{
    var values = new List<string>();
    for(int i = 0; < dataReader.FieldCount; i++)
        values.Add(dataReader[i].ToString());
    writer.WriteLine(string.Join(", ", values));
}
第一个块收集列名,然后写出标题行。第二块收集并写出行数据。 (如上所述,您需要采取措施转义引号,并保护空格和定界符。)尽管如此,此伪代码的要点是表明您可以获取动态数据并仍然构建CSV。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,509
地点
悉尼,澳大利亚
编程经验
10+
Here are some extension methods that you can use to write CSV data directly from a data reader or DataTable to a file or stream:
C#:
public static class DataReaderExtensions
{
    public static void ToCsv(this DbDataReader source, Stream stream)
    {
        using (var writer = new StreamWriter(stream))
        {
            var columnIndexes = Enumerable.Range(0, source.FieldCount).ToArray();

            writer.WriteLine(string.Join(",", columnIndexes.Select(source.GetName)));

            while (source.Read())
            {
                writer.WriteLine(@"""" + string.Join(@""",""", columnIndexes.Select(i => source.GetValue(i).ToString().Replace(@"""", @""""""))) + @"""");
            }
        }
    }

    public static void ToCsv(this DbDataReader source, string filePath)
    {
        using (var stream = File.Create(filePath))
        {
            source.ToCsv(stream);
        }
    }
}

public static class DataTableExtensions
{
    public static void ToCsv(this DataTable source, Stream stream)
    {
        using (var writer = new StreamWriter(stream))
        {
            var columns = source.Columns.Cast<DataColumn>().ToArray();

            writer.WriteLine(string.Join(",", columns.Select(c => c.ColumnName)));

            foreach (DataRow row in source.Rows)
            {
                writer.WriteLine(@"""" + string.Join(@""",""", columns.Select(c => row[c].ToString().Replace(@"""", @""""""))) + @"""");
            }
        }
    }

    public static void ToCsv(this DataTable source, string filePath)
    {
        using (var stream = File.Create(filePath))
        {
            source.ToCsv(stream);
        }
    }
}
使用项目或引用库中的这些类,您可以执行以下操作:
C#:
using (var reader = command.ExecuteReader())
{
    reader.ToCsv(filePath);
}
或这个:
C#:
adapter.Fill(table);

using (var stream = new MemoryStream())
{
    table.ToCsv(stream);
   
    // Use stream here.
}
 

giasone777

活跃的成员
已加入
2019年7月19日
留言内容
29
编程经验
1-3
一个友好的提醒,我是初学者,我的程序员朋友告诉我这是高级代码,高于我的薪水等级,所以我不知道该怎么办,我想如果你不介意的话查看此代码并告诉我为什么它不起作用,该文档会下载,但其中没有数据-谢谢您,先生。
C#:
    Response.Clear();
            Response.Buffer = true;
            Response.AddHeader("content-disposition", "attachment;filename=Employee.csv");
            Response.Charset = "";
            Response.ContentType = "application/text";
            GridView1.AllowPaging = false;
            GridView1.DataBind();

            StringBuilder columnbind = new StringBuilder();
            for (int k = 0; k < GridView1.Columns.Count; k++)
            {

                columnbind.Append(GridView1.Columns[k].HeaderText + ',');
            }

            columnbind.Append("\r\n");
            for (int i = 0; i < GridView1.Rows.Count; i++)
            {
                for (int k = 0; k < GridView1.Columns.Count; k++)
                {

                    columnbind.Append(GridView1.Rows[i].Cells[k].Text + ',');
                }

                columnbind.Append("\r\n");
            }
            Response.Output.Write(columnbind.ToString());
            Response.Flush();
            Response.End();
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,505
地点
弗吉尼亚州切萨皮克
编程经验
10+
文件中至少有要下载的列标题吗?还是那个缺失?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,505
地点
弗吉尼亚州切萨皮克
编程经验
10+
如果在此行上设置断点:
C#:
for (int k = 0; k < GridView1.Columns.Count; k++)
what is the value of GridView1.Columns.Count?

Where is the GridView1.DataSource set?
 

giasone777

活跃的成员
已加入
2019年7月19日
留言内容
29
编程经验
1-3
我明天再检查一次,但是我想在gridview1.databind()命令之后,网格将显示数据,然后将自身重置为零,这就是为什么不能从中拉取数据的原因吗?
 
最佳 底部