Отправка результатов запроса в Excel с веб-сайта ASP.NET
Мы разрешаем пользователям создавать специальные запросы на нашем веб-сайте. Мы хотели бы, чтобы пользователь выбрал свои критерии, затем нажмите "Отправить" и автоматически передайте результаты в Excel. У меня есть приложение, заполняющее DataTable, а затем используя datatable для создания строки с разделителями табуляции. Проблема заключается в том, чтобы добиться успеха.
Каков наилучший способ потоковой передачи данных в Excel? Предположительно, нам не нужно было бы закрывать пустое окно после нажатия кнопки отправки.
Ответы
Ответ 1
Измените тип файла страницы, чтобы преуспеть, и только поток HTML, необходимый для построения таблицы на странице. код здесь
//for demo purpose, lets create a small datatable & populate it with dummy data
System.Data.DataTable workTable = new System.Data.DataTable();
//The tablename specified here will be set as the worksheet name of the generated Excel file.
workTable.TableName = "Customers";
workTable.Columns.Add("Id");
workTable.Columns.Add("Name");
System.Data.DataRow workRow;
for (int i = 0; i <= 9; i++)
{
workRow = workTable.NewRow();
workRow[0] = i;
workRow[1] = "CustName" + i.ToString();
workTable.Rows.Add(workRow);
}
//...and lets put DataTable2ExcelString to work
string strBody = DataTable2ExcelString(workTable);
Response.AppendHeader("Content-Type", "application/vnd.ms-excel");
Response.AppendHeader("Content-disposition", "attachment; filename=my.xls");
Response.Write(strBody);
Ответ 2
Если вы создаете страницу, которая является только таблицей с результатами, и задайте тип содержимого страницы "application/vnd.ms-excel", то вывод будет в Excel.
Response.ContentType = "application/vnd.ms-excel";
Если вы хотите принудительно сохранить, вы сделали бы что-то вроде следующего:
Response.AddHeader("Content-Disposition", "attachment; filename=somefilename.xls");
Ответ 3
У меня есть функция utils, которая делает это уже. Как только вы помещаете его в datatable, вы можете экспортировать его с помощью Response, используя
public static void DataTabletoXLS(DataTable DT, string fileName)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Charset = "utf-16";
HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250");
HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.xls", fileName));
HttpContext.Current.Response.ContentType = "application/ms-excel";
string tab = "";
foreach (DataColumn dc in DT.Columns)
{
HttpContext.Current.Response.Write(tab + dc.ColumnName.Replace("\n", "").Replace("\t", ""));
tab = "\t";
}
HttpContext.Current.Response.Write("\n");
int i;
foreach (DataRow dr in DT.Rows)
{
tab = "";
for (i = 0; i < DT.Columns.Count; i++)
{
HttpContext.Current.Response.Write(tab + dr[i].ToString().Replace("\n", "").Replace("\t", ""));
tab = "\t";
}
HttpContext.Current.Response.Write("\n");
}
HttpContext.Current.Response.End();
}
Ответ 4
Я бы рекомендовал использовать filehandler (.ashx) Единственная проблема заключается в создании файла excel из DataTable. Есть много сторонних продуктов, которые сделают это для вас (например, Infragistics предоставляет компонент, который делает именно это).
Одна вещь, которую я настоятельно рекомендую против, - это использовать перехват Excel на вашем сервере... он очень тяжелый и не поддерживается.
Ответ 5
Как только у вас есть свой набор данных, вы можете преобразовать его в объект [,] и вставить его в документ Excel. Затем вы можете сохранить документ на диск и передать его пользователю.
//write the column headers
for (int cIndex = 1; cIndex < 1 + columns; cIndex++)
sheet.Cells.set_Item(4, cIndex, data.Columns[cIndex - 1].Caption);
if (rows > 0)
{
//select the range where the data will be pasted
Range r = sheet.get_Range(sheet.Cells[5, 1], sheet.Cells[5 + (rows - 1), columns]);
//Convert the datatable to an object array
object[,] workingValues = new object[rows, columns];
for (int rIndex = 0; rIndex < rows; rIndex++)
for (int cIndex = 0; cIndex < columns; cIndex++)
workingValues[rIndex, cIndex] = data.Rows[rIndex][cIndex].ToString();
r.Value2 = workingValues;
}
Ответ 6
Я бы использовал обработчик для расширения файла .xls и бесплатный компонент для преобразования DataTable в собственный формат xls. Компонент с этого сайта http://www.csvreader.com/ делает больше, что подразумевает URL. Самая новая версия excel будет жаловаться на файл XLS, отформатированный в формате HTML. Также имейте в виду размер возвращаемых данных. Ваш веб-сервер должен использовать сжатие для этого расширения, и ваш код должен проверить, больше ли количество возвращаемых строк больше, чем Excel может отображаться на одном листе; может потребоваться несколько листов. http://www.mrexcel.com/archive2/23600/26869.htm
Ответ 7
Просьба использовать этот код для решения вашей проблемы. Этот код преобразует листы Excel в текстовый формат. Надеюсь, это решит вашу проблему.
grdSrcRequestExport.RenderControl(oHtmlTextWriter);
string s = "";
s=oStringWriter.ToString().Replace("<table cellspacing=\"0\" rules=\"all\" border=\"1\" style=\"border-collapse:collapse;\">", "");
s="<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\"><head><meta http-equiv=Content-Type content=\"text/html; charset=us-ascii\"><meta name=ProgId content=Excel.Sheet><meta name=Generator content=\"Microsoft Excel 11\"><table x:str border=0 cellpadding=0 cellspacing=0 width=560 style='border-collapse: collapse;table-layout:fixed;width:420pt'>"+s.ToString()+"</table></body></html>";
//Byte[] bContent = System.Text.Encoding.GetEncoding("utf-8").GetBytes();
Response.Write(s);