1

我的 DataTable 中有一个名为“Comments”的字段,其中几乎没有超过 255 个字符的记录。当我们使用以下代码将 DataTable 导出到 Excel 时,数据被推送到 Excel 中,但超过 255 个字符的 Comments 字段记录与其他记录重叠Excel 中的单元格和下一列记录被推送到下一行。

代码:

Response.Clear();
Response.AddHeader("content-disposition", "attachment;filename=XXXXXX.xls");
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = "application/vnd.xls";
foreach (DataRow dr in dt.Rows){
tab = "";
for (int i = 0; i < dt.Columns.Count; i++){
Response.Write(tab + dr[i].ToString());
tab = "\t";
}
Response.Write("\n");
}
Response.End();

你们能帮忙吗

4

3 回答 3

1

因为这是 Excel 的极限

工作表和工作簿规范和限制

列宽 255 个字符

参考:Excel 规范和限制

于 2012-08-21T10:32:59.167 回答
0

使用EPPlus excel 库并创建真正的 excel 文件,它是免费和开源的,并且运行良好。

我测试了这个场景并用超过 4096 字节的文本填充单元格,它工作正常,但使用 excel 2010 和 xslx 格式。

这是示例代码:

  ExcelPackage ePack = new ExcelPackage(new FileInfo("c:\\temp\\temp.xlsx"));
  ExcelWorksheet ws = ePack.Workbook.Worksheets.Add("Sheet1");
  string longText = "Lorem ipsum ..... <snipped>";
  ws.Cells[1, 1].Value = longText;
  ePack.Save();

顺便提一句。您可以在此处找到如何将 DataTable 导出到 excel 文件的示例:

https://stackoverflow.com/a/9569827/351383

于 2012-08-22T15:35:36.723 回答
0

尝试使用此代码,可能会有所帮助

    public static void DataSetsToExcel(DataSet dataSet, string filepath)
    {
        try
        {
            string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=Excel 12.0 Xml;";
            string tablename = "";
            DataTable dt = new DataTable();
            foreach (System.Data.DataTable dataTable in dataSet.Tables)
            {
                dt = dataTable;
                tablename = dataTable.TableName;
                using (OleDbConnection con = new OleDbConnection(connString))
                {
                    con.Open();
                    StringBuilder strSQL = new StringBuilder();
                    strSQL.Append("CREATE TABLE ").Append("[" + tablename + "]");
                    strSQL.Append("(");
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        strSQL.Append("[" + dt.Columns[i].ColumnName + "] text,");
                    }
                    strSQL = strSQL.Remove(strSQL.Length - 1, 1);
                    strSQL.Append(")");

                    OleDbCommand cmd = new OleDbCommand(strSQL.ToString(), con);
                    cmd.ExecuteNonQuery();

                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        strSQL.Clear();
                        StringBuilder strfield = new StringBuilder();
                        StringBuilder strvalue = new StringBuilder();
                        for (int j = 0; j < dt.Columns.Count; j++)
                        {
                            strfield.Append("[" + dt.Columns[j].ColumnName + "]");
                            strvalue.Append("'" + dt.Rows[i][j].ToString().Replace("'", "''") + "'");
                            if (j != dt.Columns.Count - 1)
                            {
                                strfield.Append(",");
                                strvalue.Append(",");
                            }
                            else
                            {
                            }
                        }
                        if (strvalue.ToString().Contains("<br/>"))
                        {
                            strvalue = strvalue.Replace("<br/>", Environment.NewLine);
                        }
                        cmd.CommandText = strSQL.Append(" insert into [" + tablename + "]( ")
                            .Append(strfield.ToString())
                            .Append(") values (").Append(strvalue).Append(")").ToString();
                        cmd.ExecuteNonQuery();
                    }
                    con.Close();
                }
            }
        }
        catch (Exception ex)
        {                
        }
    }
于 2013-10-23T13:54:07.317 回答