تصدير بيانات عرض الشبكة
-
05-07-2019 - |
سؤال
ما هي أفضل طريقة لتصدير طريقة عرض الشبكة إلى جدول بيانات Excel؟ هذا يبدو سهلا
باستثناء أن Gridview الخاص بي لا يحتوي على سمة تصدير.ما هي أسرع طريقة للقيام بذلك؟
المحلول
في تصدير إلى التفوق كتابة هذا الرمز على 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);
}
هذه المكتبة للحصول على صافي عملت بشكل جيد جدا لحالات الاستخدام لدينا.
<اقتباس فقرة>وهذه المكتبة تسمح لك لتوليد إكسل المصنفات باستخدام 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
ومن ثم من خلال كافة الصفوف. الشيء الوحيد هو أنه إذا كنت تسمح الترحيل وقمت أكثر من صفحة واحدة لديك لتعيين حجم الصفحة إلى قيمة عالية (أنا وضعت على 10000000) ثم DataBind
وGridView
مرة أخرى والقيام عملك. بعد ذلك تعيين قيمة حجم الصفحة القديمة مرة أخرى. اذا كان هناك من يعرف حلا أفضل، وكنت موضع ترحيب.
وتحرير: حاول / 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
ويجب أن يكون التفوق تثبيت والرجوع إلى مكتبات إمكانية التشغيل المتداخل مكتب في المشروع. إضافة:
واردات Microsoft.Office.Core، واردات Microsoft.Office.Interop
والحل فوق يأخذ gridview ويسحب أتش تي أم أل للخروج منه. ثم يكتب إلى التفوق. سوف أتش تي أم أل القادمة من الشبكة تتضمن سمات نمط مثل الحشو ولون. وسوف تقدم أيضا عناوين الأعمدة للفرز تبدو الروابط. عندما كنت هذا كتبت محلل مخصص لتجريد كل التصميم غير المرغوب فيها من أن تعطيني فقط على البيانات الخام. سأترك هذه المهمة متروك لكم لأنه معين على كل شبكة.
ومن المهم جدا أن تقوم بتضمين تجاوز لVerifyRenderingInServerForm، على الرغم من أنه لا يوجد أي رمز داخل منه.