экспорт данных в режиме сетки
-
05-07-2019 - |
Вопрос
Каков наилучший способ экспортировать 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, она на 100% построена на 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 обратно. Если кто-то знает лучшее решение, добро пожаловать.
РЕДАКТИРОВАТЬ: Try / catch есть, потому что по какой-то причине невозможно проверить тип элемента управления и затем привести к метке или Вот мой код. 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. Затем пишет это, чтобы преуспеть. HTML-код из сетки будет включать такие атрибуты стиля, как padding & amp; цвет. Это также сделает сортируемые заголовки столбцов похожими на ссылки. Когда я использовал это, я написал собственный анализатор, чтобы убрать все ненужные стили, чтобы получить только необработанные данные. Я оставлю эту задачу на ваше усмотрение, поскольку она специфична для каждой сетки.
Очень важно включить переопределение в VerifyRenderingInServerForm, даже если внутри него нет кода.