Как лучше всего экспортировать сетку в электронную таблицу Excel? Это кажется простым
за исключением того, что у моего Gridview нет атрибута экспорта. Как это сделать быстрее всего?
Как лучше всего экспортировать сетку в электронную таблицу Excel? Это кажется простым
за исключением того, что у моего Gridview нет атрибута экспорта. Как это сделать быстрее всего?
При экспорте в Excel Напишите этот код в событии btnexporttoExcel Click.
string attachment = "attachment; filename=Export.xls";
Response.ClearContent();
Response.AddHeader("content-disposition", attachment);
Response.ContentType = "application/ms-excel";
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
// Create a form to contain the grid
HtmlForm frm = new HtmlForm();
gv.Parent.Controls.Add(frm);
frm.Attributes["runat"] = "server";
frm.Controls.Add(gv);
frm.RenderControl(htw);
//GridView1.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();
Возможно, для этого есть что-то, но если вы хотите сделать это самостоятельно, вы можете просто написать код, который просматривает коллекцию GridView.Rows, а затем коллекцию GridViewRow.Cells внутри нее.
Создать CSV-файл оттуда должно быть довольно легко, и Excel без проблем его прочитает.
Файлы CSV - это просто текстовые файлы со значениями внутри кавычек, разделенными запятыми. Нравится:
"value", "value", "value"
"value", "value", "value"
Вы можете просто открыть Блокнот и собрать его вручную, чтобы попробовать.
Я делал это несколько раз. У Excel есть версия XML. Он заканчивается расширением .xml, но вы можете просто изменить расширение файла на .xls, и файл в формате XML откроется в Excel.
Самым большим препятствием для этого подхода является формат Excel XML. Обычно я создаю файл Excel в формате Excel в том приблизительном формате, который мне нужен. Затем я сохраняю файл Excel в формате XML и открываю его в текстовом редакторе.
Обычно я создаю файл шаблона из этой страницы примера Excel. Затем, когда я экспортирую информацию в Gridview, мне нужно только создать xml для раздела, который содержит ячейки, которые я планирую заполнить, я просто добавляю и добавляю текст, уже находящийся в файле шаблона.
Как только вы откроете файл Excel в формате xml, вы сравнительно легко определите необходимый XML. Сложнее всего понять, как ячейки ссылаются на параметры форматирования, которые находятся в верхней части файла XML.
Удачи, дайте мне знать, если вам нужны дополнительные разъяснения.
Изменить: вам нужно будет создать файл Excel шаблона только один раз, чтобы получить представление о необходимом xml, который вам нужно сгенерировать. После того, как вы сгенерировали xml, используйте следующий код, чтобы отправить его пользователю:
string fileName = "ExportedFile.xls";
Response.Clear();
Response.Buffer = true;
Response.ContentType = "text/xml";
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
ExportToExcel(HttpContext.Current.Response.OutputStream, testUID);
Response.End();
public static void ExportToExcel(Stream outputStream)
{
XmlTextWriter xmlSink = new XmlTextWriter(outputStream, Encoding.Default);
//ExcelHeaderString and ExcelStylesString are from the template
xmlSink.WriteRaw(ExcelHeaderString);
xmlSink.WriteRaw(ExcelStylesString);
//write your elements here
xmlSink.WriteElement("YourElements");
//ExcelFooterString is from the template
xmlSink.WriteRaw(ExcelFooterString);
}
Эта библиотека для .net очень хорошо зарекомендовала себя в наших случаях использования.
Эта библиотека позволяет создавать книги Excel с использованием XML, она полностью построена на C # и не требует установки Excel для создания файлов. Он предоставляет простую объектную модель для создания рабочих книг XML.
Встроенной интеграции с элементом управления GridView нет, но написать универсальный адаптер достаточно просто, и его можно будет повторно использовать в других проектах.
Этот метод переходит прямо в формат Excel, не требуя установки XML на сервере или использования XML.
Protected Sub ExportToExcel()
Dim gv1 As GridView = FindControlRecursive(objPlaceHolder, "GridView1")
If Not gv1 Is Nothing Then
Response.ClearHeaders()
Response.ClearContent()
' Set the content type to Excel
Response.ContentType = "application/vnd.ms-excel"
' make it open the save as dialog
Response.AddHeader("content-disposition", "attachment; filename=ExcelExport.xls")
'Turn off the view state
Me.EnableViewState = False
'Remove the charset from the Content-Type header
Response.Charset = String.Empty
Dim myTextWriter As New System.IO.StringWriter
Dim myHtmlTextWriter As New System.Web.UI.HtmlTextWriter(myTextWriter)
Dim frm As HtmlForm = New HtmlForm()
Controls.Add(frm)
frm.Controls.Add(gv1)
'Get the HTML for the control
frm.RenderControl(myHtmlTextWriter)
'Write the HTML to the browser
Response.Write(myTextWriter.ToString())
'End the response
Response.End()
End If
End Sub
Private Function FindControlRecursive(ByVal root As Control, ByVal id As String) As Control
If root.ID = id Then
Return root
End If
Dim c As Control
For Each c In root.Controls
Dim t As Control = FindControlRecursive(c, id)
If Not t Is Nothing Then
Return t
End If
Next
Return Nothing
End Function
Я использовал CarlosAg.ExcelXmlWriter
ссылку.
Я перебрал все GridViews
HeaderCells
, а затем все ряды. Единственное, что если вы разрешаете разбиение на страницы и у вас более одной страницы, вам нужно установить для PageSize высокое значение (я установил 10000000), затем снова DataBind
GridView
и выполнять свою работу. После этого верните старое значение PageSize. Если кто-то знает лучшее решение, милости просим.
РЕДАКТИРОВАТЬ: попытка / уловка существует, потому что по какой-то причине невозможно проверить тип элемента управления, а затем преобразовать его в Label или LinkButton ==> control.GetType()
.
Вот мой код.
public static Workbook CreateWorkbook(GridView gridView)
{
int pageSize = gridView.PageSize;
gridView.PageSize = 10000000;
gridView.DataBind();
Workbook workbook = new Workbook();
Worksheet sheet = workbook.Worksheets.Add("Export");
WorksheetStyle style = workbook.Styles.Add("headerStyle");
style.Font.Bold = true;
style = workbook.Styles.Add("defaultStyle");
style.Alignment.WrapText = true;
style = workbook.Styles.Add("infoStyle");
style.Font.Color = "Red";
style.Font.Bold = true;
sheet.Table.Rows.Add(new WorksheetRow());
WorksheetRow headerRow = new WorksheetRow();
foreach (DataControlFieldHeaderCell cell in gridView.HeaderRow.Cells)
{
if (!string.IsNullOrEmpty(cell.Text))
headerRow.Cells.Add(cell.Text, DataType.String, "headerStyle");
else
foreach (Control control in cell.Controls)
{
LinkButton linkButton = new LinkButton();
try
{
linkButton = (LinkButton)control;
}
catch { }
if (!string.IsNullOrEmpty(linkButton.Text))
headerRow.Cells.Add(linkButton.Text, DataType.String, "headerStyle");
else
{
Label label = new Label();
try
{
label = (Label)control;
}
catch { }
if (!string.IsNullOrEmpty(label.Text))
headerRow.Cells.Add(label.Text, DataType.String, "headerStyle");
}
}
}
sheet.Table.Rows.Add(headerRow);
foreach (GridViewRow row in gridView.Rows)
{
WorksheetRow wrow = new WorksheetRow();
foreach (TableCell cell in row.Cells)
{
foreach (Control control in cell.Controls)
{
if (control.GetType() == typeof(Label))
{
wrow.Cells.Add(((Label)control).Text, DataType.String, "defaultStyle");
}
}
}
sheet.Table.Rows.Add(wrow);
}
gridView.PageSize = pageSize;
return workbook;
}
Private exportToExcel As Boolean = False
Private Sub LoadInExcel()
Me.Response.ClearContent()
Me.Response.AddHeader("content-disposition", "attachment; filename=MyFile.xls")
Me.Response.ContentType = "application/ms-excel"
Dim sw1 As New IO.StringWriter
Dim htw1 As HtmlTextWriter = New HtmlTextWriter(sw1)
GridView1.RenderControl(htw1)
Response.Write(sw1.ToString())
Response.End()
End Sub
Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
' Confirms that an HtmlForm control is rendered for the specified ASP.NET
' server control at run time.
End Sub
Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
If exportToExcel Then
LoadInExcel()
End If
MyBase.Render(writer)
End Sub
Protected Sub btnPrint_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPrint.Click
exportToExcel = True
End Sub
У вас должен быть установлен Excel и ссылки на библиотеки взаимодействия Office в вашем проекте. Добавлять:
Импортирует Microsoft.Office.Core, Импортирует Microsoft.Office.Interop.
Приведенное выше решение берет вид сетки и извлекает из него html. Потом пишет в excel. HTML-код, поступающий из сетки, будет включать атрибуты стиля, такие как отступы и цвет. Это также сделает сортируемые заголовки столбцов похожими на ссылки. Когда я использовал это, я написал собственный синтаксический анализатор, чтобы удалить все нежелательные стили, чтобы предоставить мне только необработанные данные. Я оставлю эту задачу вам, поскольку она специфична для каждой сетки.
Очень важно включить переопределение в VerifyRenderingInServerForm, даже если внутри него нет никакого кода.