How to export a JQgrid data to Excel using c#?
Asked Answered
R

3

5

I have made some research regarding this but most of the solutions are for MVC.. I am just using Asp.net 3.5 How could i achieve this on button click.. Should i include any library or anything else.. Please help..

Royalroyalist answered 19/12, 2012 at 14:53 Comment(0)
B
3

The code which I posted in the answer can be used practically without any modification in any ASP.NET code which are written in C#. The helper class DataForExcel (see the file DataForExcel.cs) has constructor

public DataForExcel(string[] headers, List<string[]> data, string sheetName)

or a little more "advanced" version

public DataForExcel(string[] headers, DataType[] colunmTypes,
                    List<string[]> data, string sheetName)

which allow to specify which columns have numeric datatype. The parameter List<string[]> data is the data which need be exported to Excel. The parameter string[] headers specify the data for the first line of the output.

The class DataForExcel has only one public method

public void CreateXlsxAndFillData(Stream stream)

which fill stream with the binary representation of resulting .XLSX Excel file.

To return the binary data from your ASP.NET method (for example ASHX handler) you need just do almost the same what do ExecuteResult from my answer:

  • create memory stream with using (var stream = new MemoryStream()) {...}
  • create DataForExcel object needed for export to Excel var dataExcel = new DataForExcel (new []{"Id", "Votes", "Title"}, "Questions.xlsx", "Name or Sheet");
  • response.AddHeader ("content-disposition", "attachment; filename=Questions.xlsx");
  • response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
  • response.ContentEncoding = Encoding.UTF8;
  • stream.WriteTo (response.OutputStream);
  • response.Flush();

It's all.

UPDATED: I modified the code which I posted before to create in very easy way the Excel file (in .xlsx format) from the grid. If you use OpenXML SDK 2.0 then you can use .NET 3.5. OpenXML SDK 2.5 required .NET 4.0 or higher.

The suggested code allows to convert string[][] of data to binary Excel data and write the results in Stream. You can use MemoryStream like I described before to return Excel from any ASP.NET application.

The suggested code contain ExportToExcel static class with one public static method FillSpreadsheetDocument which can be used in the following way

var data = new[] {
    new [] {"Tom",       "30", "x", "",  "1974-06-16"},
    new [] {"Margarita", "34", "x", "x", "1978-10-02"},
    new [] {"Bob",       "7",  "",  "",  "2005-06-26"},
    new [] {"Oleg",      "48", "x", "x", "1964-09-11"},
    new [] {"Frank",     "29", "",  "x", "1983-01-28"}
};
using (var stream = new FileStream("Test.xlsx", FileMode.Create)) {
    ExportToExcel.FillSpreadsheetDocument(stream,
        new[] {
            new ColumnModel { Type = DataType.String, Alignment = HorizontalAlignment.Left, Header = "Name" },
            new ColumnModel { Type = DataType.Integer, Header = "Age" },
            new ColumnModel { Type = DataType.String, Header = "Is Married", Alignment = HorizontalAlignment.Center, IsRotatedHeader = true },
            new ColumnModel { Type = DataType.String, Header = "Has Children", Alignment = HorizontalAlignment.Center, IsRotatedHeader = true },
            new ColumnModel { Type = DataType.Date, Header = "Birthday", Alignment = HorizontalAlignment.Left }
        },
        data,
        "Friends");
}

It produces the "Test.xlsx" with one sheet "Friends" which looks

enter image description here

The width of the columns will be not set, but in two clicks (select all and double click on between columns) one the user can set the width of columns to optimal width like on the build above. All cells has formatted data (no "Generic" format). I used integer, date and pure strings. One can easy create columns with center alignment or right alignment texts.

You can easy modify the code so that more different text formats will be used. It's just an example how to produce real Excel document with formatted cells.

The working Visual Studio 2008 Project you can download from here. Below you will find the source code from the demo:

using System;
using System.Collections.Generic;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Text;
using System.IO;
using System.Globalization;

namespace ExportToExcel {
    public enum ExcelCellDataType {
        String,
        Integer,
        Date
    }
    public enum HorizontalAlignment {
        Left,
        Center,
        Right
    }
    public class ColumnModel {
        public ExcelCellDataType Type { set; get; }
        public HorizontalAlignment Alignment { set; get; }
        public string Header { set; get; }
        public bool IsRotatedHeader { set; get; }
    }
    public enum OutputCellFormat: uint {
        Text,
        Integer,
        Date,
        TextHeader,
        TextHeaderRotated,
        TextCenter,
        TextRight
    }

    public static class ExportToExcel {
        private static StringBuilder ConvertIntToColumnHeader (uint iCol) {
            var sb = new StringBuilder();

            while (iCol > 0) {
                if (iCol <= 'Z' - 'A') // iCol=0 -> 'A', 25 -> 'Z'
                    break;
                sb.Append(ConvertIntToColumnHeader(iCol / ('Z' - 'A' + 1) - 1));
                iCol = iCol % ('Z' - 'A' + 1);
            }
            sb.Append((char)('A' + iCol));

            return sb;
        }

        private static string GetCellReference (uint iRow, uint iCol) {
            return ConvertIntToColumnHeader(iCol).Append(iRow).ToString();
        }

        private static Row CreateColumnHeaderRow (uint iRow, IList<ColumnModel> colunmModels) {
            var r = new Row { RowIndex = iRow };

            for (var iCol = 0; iCol < colunmModels.Count; iCol++) {
                var styleIndex = colunmModels[iCol].IsRotatedHeader
                                     ? (UInt32Value)(uint)(OutputCellFormat.TextHeaderRotated + 1)
                                     : (UInt32Value)(uint)(OutputCellFormat.TextHeader + 1);
                r.Append(new OpenXmlElement[] {
                    // create Cell with InlineString as a child, which has Text as a child
                    new Cell(new InlineString(new Text { Text = colunmModels[iCol].Header })) {
                        DataType = CellValues.InlineString,
                        StyleIndex = styleIndex,
                        CellReference = GetCellReference(iRow, (uint)iCol)
                    }
                });
            }

            return r;
        }

        private static UInt32Value GetStyleIndexFromColumnModel (ColumnModel colunmModel) {
            switch (colunmModel.Type) {
                case ExcelCellDataType.Integer:
                    return (uint)(OutputCellFormat.Integer) + 1;
                case ExcelCellDataType.Date:
                    return (uint)(OutputCellFormat.Date) + 1;
            }

            switch (colunmModel.Alignment) {
                case HorizontalAlignment.Center:
                    return (uint)(OutputCellFormat.TextCenter) + 1;
                case HorizontalAlignment.Right:
                    return (uint)(OutputCellFormat.TextRight) + 1;
                default:
                    return (uint)(OutputCellFormat.Text) + 1;
            }
        }

        private static string ConvertDateToString (string date) {
            DateTime dt;
            string text = date; // default results of conversion
            if (DateTime.TryParse(date, out dt))
                text = dt.ToOADate().ToString(CultureInfo.InvariantCulture);
            return text;
        }

        private static Row CreateRow (UInt32 iRow, IList<string> data, IList<ColumnModel> colunmModels, IDictionary<string, int> sharedStrings) {
            var r = new Row { RowIndex = iRow };
            for (var iCol = 0; iCol < data.Count; iCol++) {
                var styleIndex = (uint)(OutputCellFormat.Text) + 1;
                string text = data[iCol] ?? String.Empty;
                if (colunmModels != null && iCol < colunmModels.Count) {
                    styleIndex = GetStyleIndexFromColumnModel(colunmModels[iCol]);
                    switch (colunmModels[iCol].Type) {
                        case ExcelCellDataType.Integer:
                            r.Append(new OpenXmlElement[] {
                                // create Cell with CellValue as a child, which has Text as a child
                                new Cell(new CellValue { Text = text }) {
                                    StyleIndex = styleIndex,
                                    CellReference = GetCellReference(iRow, (uint)iCol)
                                }
                            });
                            continue;
                        case ExcelCellDataType.Date:
                            r.Append(new OpenXmlElement[] {
                                // create Cell with CellValue as a child, which has Text as a child
                                new Cell(new CellValue { Text = ConvertDateToString(text) }) {
                                    StyleIndex = styleIndex,
                                    CellReference = GetCellReference(iRow, (uint)iCol)
                                }
                            });
                            continue;
                    }
                }

                // default format is text
                if (String.IsNullOrEmpty(text) || !sharedStrings.ContainsKey(text)) {
                    // create Cell with InlineString as a child, which has Text as a child
                    r.Append(new OpenXmlElement[] {
                        new Cell(new InlineString(new Text { Text = text })) {
                            DataType = CellValues.InlineString,
                            StyleIndex = styleIndex,
                            CellReference = GetCellReference(iRow, (uint)iCol)
                        }
                    });
                } else {
                    r.Append(new OpenXmlElement[] {
                        // create Cell with CellValue as a child, which has Text as a child
                        new Cell(new CellValue { Text = sharedStrings[text].ToString(CultureInfo.InvariantCulture) }) {
                            DataType = CellValues.SharedString,
                            StyleIndex = styleIndex,
                            CellReference = GetCellReference(iRow, (uint)iCol)
                        }
                    });
                }
            }

            return r;
        }

        private static void FillSpreadsheetDocument (SpreadsheetDocument spreadsheetDocument, IList<ColumnModel> columnModels, IList<string[]> data, string sheetName) {
            if (columnModels == null)
                throw new ArgumentNullException("columnModels");
            if (data == null)
                throw new ArgumentNullException("data");

            // add empty workbook and worksheet to the SpreadsheetDocument
            var workbookPart = spreadsheetDocument.AddWorkbookPart();
            var worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
            var workbookStylesPart = workbookPart.AddNewPart<WorkbookStylesPart>();

            // create styles for the header and columns
            workbookStylesPart.Stylesheet = new Stylesheet(
                new Fonts(
                // Index 0 - The default font.
                    new Font(
                        new FontSize { Val = 11 },
                        new Color { Rgb = new HexBinaryValue { Value = "00000000" } },
                        new FontName { Val = "Calibri" }
                    ),
                // Index 1 - The bold font.
                    new Font(
                        new Bold(),
                        new FontSize { Val = 11 },
                        new Color { Rgb = new HexBinaryValue { Value = "00000000" } },
                        new FontName { Val = "Calibri" }
                    )
                ),
                new Fills(
                // Index 0 - required, reserved by Excel - no pattern
                    new Fill(new PatternFill { PatternType = PatternValues.None }),
                // Index 1 - required, reserved by Excel - fill of gray 125
                    new Fill(new PatternFill { PatternType = PatternValues.Gray125 }),
                // Index 2 - no pattern text on gray background
                    new Fill(new PatternFill {
                        PatternType = PatternValues.Solid,
                        BackgroundColor = new BackgroundColor { Indexed = 64U },
                        ForegroundColor = new ForegroundColor { Rgb = "FFD9D9D9" }
                    })
                ),
                new Borders(
                // Index 0 - The default border.
                    new Border(
                        new LeftBorder(),
                        new RightBorder(),
                        new TopBorder(),
                        new BottomBorder(),
                        new DiagonalBorder()
                    ),
                // Index 1 - Applies a Left, Right, Top, Bottom border to a cell
                    new Border(
                        new LeftBorder(new Color { Auto = true }) { Style = BorderStyleValues.Thin },
                        new RightBorder(new Color { Auto = true }) { Style = BorderStyleValues.Thin },
                        new TopBorder(new Color { Auto = true }) { Style = BorderStyleValues.Thin },
                        new BottomBorder(new Color { Auto = true }) { Style = BorderStyleValues.Thin },
                        new DiagonalBorder()
                    )
                ),
                new CellFormats(
                // Index 0 - The default cell style.  If a cell does not have a style iCol applied it will use this style combination instead
                    new CellFormat {
                        NumberFormatId = (UInt32Value)0U,
                        FontId = (UInt32Value)0U,
                        FillId = (UInt32Value)0U,
                        BorderId = (UInt32Value)0U
                    },
                // Index 1 - Alignment Left, Text
                    new CellFormat(new Alignment { Horizontal = HorizontalAlignmentValues.Left }) {
                        NumberFormatId = (UInt32Value)49U, // "@" - text format - see http://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.numberingformat.aspx
                        FontId = (UInt32Value)0U,
                        FillId = (UInt32Value)0U,
                        BorderId = (UInt32Value)1U,
                        ApplyNumberFormat = true,
                        ApplyAlignment = true
                    },
                // Index 2 - Interger Number
                    new CellFormat {
                        NumberFormatId = (UInt32Value)1U, // "0" - integer format - see http://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.numberingformat.aspx
                        FontId = (UInt32Value)0U,
                        FillId = (UInt32Value)0U,
                        BorderId = (UInt32Value)1U,
                        ApplyNumberFormat = true
                    },
                // Index 3 - Interger Date
                    new CellFormat {
                        NumberFormatId = (UInt32Value)14U, // "14" - date format mm-dd-yy - see http://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.numberingformat.aspx
                        FontId = (UInt32Value)0U,
                        FillId = (UInt32Value)0U,
                        BorderId = (UInt32Value)1U,
                        ApplyNumberFormat = true
                    },
                // Index 4 - Text for headers
                    new CellFormat(new Alignment {
                        Vertical = VerticalAlignmentValues.Center,
                        Horizontal = HorizontalAlignmentValues.Center
                    }) {
                        NumberFormatId = (UInt32Value)49U, // "@" - text format - see http://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.numberingformat.aspx
                        FontId = (UInt32Value)1U,
                        FillId = (UInt32Value)2U,
                        BorderId = (UInt32Value)1U,
                        ApplyNumberFormat = true,
                        ApplyAlignment = true
                    },
                // Index 5 - Text for headers rotated
                    new CellFormat(new Alignment {
                        Horizontal = HorizontalAlignmentValues.Center,
                        TextRotation = (UInt32Value)90U
                    }) {
                        NumberFormatId = (UInt32Value)49U, // "@" - text format - see http://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.numberingformat.aspx
                        FontId = (UInt32Value)1U,
                        FillId = (UInt32Value)2U,
                        BorderId = (UInt32Value)1U,
                        ApplyNumberFormat = true,
                        ApplyAlignment = true
                    },
                // Index 6 - Alignment Center, Text
                    new CellFormat(new Alignment { Horizontal = HorizontalAlignmentValues.Center }) {
                        NumberFormatId = (UInt32Value)49U, // "@" - text format - see http://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.numberingformat.aspx
                        FontId = (UInt32Value)0U,
                        FillId = (UInt32Value)0U,
                        BorderId = (UInt32Value)1U,
                        ApplyNumberFormat = true,
                        ApplyAlignment = true
                    },
                // Index 7 - Alignment Right, Text
                    new CellFormat(new Alignment { Horizontal = HorizontalAlignmentValues.Right }) {
                        NumberFormatId = (UInt32Value)49U, // "@" - text format - see http://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.numberingformat.aspx
                        FontId = (UInt32Value)0U,
                        FillId = (UInt32Value)0U,
                        BorderId = (UInt32Value)1U,
                        ApplyNumberFormat = true,
                        ApplyAlignment = true
                    }
                )
            );
            workbookStylesPart.Stylesheet.Save();

            // create and fill SheetData
            var sheetData = new SheetData();

            // first row is the header
            uint iRow = 1;
            sheetData.AppendChild(CreateColumnHeaderRow(iRow++, columnModels));

            //iRow++; // skip one row for the filter
            // first of all collect all different strings
            var sst = new SharedStringTable();
            var sharedStrings = new SortedDictionary<string, int>();
            foreach (var dataRow in data)
                for (var iCol = 0; iCol < dataRow.Length; iCol++)
                    if (iCol >= columnModels.Count || columnModels[iCol].Type != ExcelCellDataType.Integer) {
                        string text = (columnModels[iCol].Type == ExcelCellDataType.Date
                                          ? dataRow[iCol]
                                          : ConvertDateToString(dataRow[iCol])) ?? String.Empty;
                        if (!String.IsNullOrEmpty(text) && !sharedStrings.ContainsKey(text)) {
                            sst.AppendChild(new SharedStringItem(new Text(text)));
                            sharedStrings.Add(text, sharedStrings.Count);
                        }
                    }

            var shareStringPart = workbookPart.AddNewPart<SharedStringTablePart>();
            shareStringPart.SharedStringTable = sst;

            shareStringPart.SharedStringTable.Save();

            foreach (var dataRow in data)
                sheetData.AppendChild(CreateRow(iRow++, dataRow, columnModels, sharedStrings));

            // add sheet data to Worksheet
            worksheetPart.Worksheet = new Worksheet(sheetData);
            worksheetPart.Worksheet.Save();

            // fill workbook with the Worksheet
            spreadsheetDocument.WorkbookPart.Workbook = new Workbook(
                    new FileVersion { ApplicationName = "Microsoft Office Excel" },
                    new Sheets(new Sheet {
                        Name = sheetName,
                        SheetId = (UInt32Value)1U,
                        Id = workbookPart.GetIdOfPart(worksheetPart) // generate the id for sheet
                    })
                );
            spreadsheetDocument.WorkbookPart.Workbook.Save();
            spreadsheetDocument.Close();
        }

        public static void FillSpreadsheetDocument (Stream stream, IList<ColumnModel> columnModels, IList<string[]> data, string sheetName) {
            using (var spreadsheetDocument = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook)) {
                FillSpreadsheetDocument(spreadsheetDocument, columnModels, data, sheetName);
            }
        }
    }

    class Program {
        static void Main () {
            var data = new[] {
                new [] {"Tom",       "30", "x", null,  "1974-06-16"},
                new [] {"Margarita", "34", "x",  "x",          null},
                new [] {"Bob",       "7",  "",    "",  "2005-06-26"},
                new [] {"Oleg",      null, "x",   "x", "1964-09-11"},
                new [] {"Frank",     "29", "",    "x", "1983-01-28"}
            };
            using (var stream = new FileStream("Test.xlsx", FileMode.Create)) {
                ExportToExcel.FillSpreadsheetDocument(stream,
                    new[] {
                        new ColumnModel { Type = ExcelCellDataType.String, Alignment = HorizontalAlignment.Left, Header = "Name" },
                        new ColumnModel { Type = ExcelCellDataType.Integer, Header = "Age" },
                        new ColumnModel { Type = ExcelCellDataType.String, Header = "Is Married", Alignment = HorizontalAlignment.Center, IsRotatedHeader = true },
                        new ColumnModel { Type = ExcelCellDataType.String, Header = "Has Children", Alignment = HorizontalAlignment.Center, IsRotatedHeader = true },
                        new ColumnModel { Type = ExcelCellDataType.Date, Header = "Birthday", Alignment = HorizontalAlignment.Left }
                    },
                    data,
                    "Friends");
            }
        }
    }
}
Biel answered 19/12, 2012 at 16:50 Comment(9)
I am new to this.. so kindly excuse me if my doubt is silly.. I need to export the data on button click.. where should i include the class ExecuteResult.. and should i include DataForExcel as a seperate cs..How could i bind the button click with these..Royalroyalist
Could you specify what kind of ASP.NET 3.5 application you use? Do you use currently Ajax? Do you use ASHX, ASMX Web services, WCF or something else? Which version of Visual Studio you use?Biel
i am just displaying the grid in aspx page.. I have a button for exporting to grid.. On that button click i need to export the available grid data to excel..Royalroyalist
I have somhow managed to export the JQgrid data to excel.. But it is not formatted and aligned correctly.. Is it possible to format or align while exporting it..Royalroyalist
@Xavier: Everything is possible, but you have to extend my code so that CreateSharedTextCell and CreateNumberCell have additional styleIndex parameter of the type UInt32Value. You nee just set StyleIndex property of the cell. In the way you can do almost everything what you need. You need additionally create new CellFormat by using new CellFormat(), setting Alignment to the format and add the format to styleSheet.CellFormats.Append.Biel
@Xavier: You can find more information in the code examples here and hereBiel
But i havent solved in the way u specified.. I have done like this #3369448.. so can i align the cells by using this method..Royalroyalist
@Xavier: I wrote in my answer that such simple conversion using HtmlTextWriter can produce wrong data during importing. In my case some texts like version number of software like "1.3.1963" was wrong converted to date. One had different importing results depend on the user's locale. It was almost impossible convert the data back to original value. If you have large Excel table where in some places the data are wrong - it's very dangerous. Exactly because of the reason I had to use Open XML SDK 2.0.Biel
@Xavier: I included in my answer the code which work under .NET 3.5 and which produce formatted Excel document. It use aligned texts in cells.Biel
M
1

php + jqgrid + export to excel

While that is a PHP solution the core of it seemed to be in the Javascript if that is of any help.

Mesocratic answered 19/12, 2012 at 15:20 Comment(1)
I have somhow managed to export the JQgrid data to excel.. But it is not formatted and aligned correctly.. Is it possible to format or align while exporting it..Royalroyalist
C
0

You can use Office XML Format (http://en.wikipedia.org/wiki/Microsoft_Office_XML_formats). The only drawback is the output will be an XML file rather than a binary. However, it opens and behaves EXACTLY the same as way as the regular .xls file.

The way I did before is to reverse engineer Excel in the format I need it, then save it as .xml format, open it in Notepad++, and figure out the header, the table (converted from grid), and lastly the footer

Example:

Header (can be hard coded)

<?xml version="1.0"?>
            <?mso-application progid="Excel.Sheet"?>
            <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
             xmlns:o="urn:schemas-microsoft-com:office:office"
             xmlns:x="urn:schemas-microsoft-com:office:excel"
             xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
             xmlns:html="http://www.w3.org/TR/REC-html40">
             <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
              <Author>phpGrid.com</Author>
              <Created></Created>
              <LastSaved></LastSaved>
              <Version></Version>
             </DocumentProperties>
             <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
                <WindowHeight>768</WindowHeight>
                <WindowWidth>1024</WindowWidth>
                <WindowTopX>0</WindowTopX>
                <WindowTopY>0</WindowTopY>
                <ProtectStructure>False</ProtectStructure>
                <ProtectWindows>False</ProtectWindows>
            </ExcelWorkbook>
            <Styles>
                <Style ss:ID="Default" ss:Name="Normal">
                    <Alignment ss:Vertical="Bottom" />
                    <Borders/>
                    <Font ss:FontName="Arial" ss:Size="8" />
                    <Interior/>
                    <NumberFormat />
                    <Protection />
                </Style>
                <Style ss:ID="sHyperlink" ss:Name="Hyperlink">
                    <Font ss:Color="#0000FF" ss:Underline="Single" />
                </Style>
                <Style ss:ID="sDate">
                    <NumberFormat ss:Format="Short Date"/>
                </Style>
                <Style ss:ID="sNumber">
                    <NumberFormat/>
                </Style>                
                <Style ss:ID="sHeader">
                    <Font ss:Family="Arial" ss:Bold="1" />
                </Style>
                <Style ss:ID="sDecimal">
                    <NumberFormat ss:Format="Fixed"/>
                </Style>
            </Styles><Worksheet ss:Name="Sheet1">

Body (this is the table converted from datagrid. Need to be dynamically generated)

<Table ss:ExpandedColumnCount="7" 
              ss:ExpandedRowCount="328" x:FullColumns="1"
              x:FullRows="1"><Row><Cell ss:StyleID="sHeader"><Data ss:Type="String">Order No.</Data></Cell><Cell ss:StyleID="sHeader"><Data ss:Type="String">Order Date</Data></Cell><Cell ss:StyleID="sHeader"><Data ss:Type="String">Shipped Date</Data></Cell><Cell ss:StyleID="sHeader"><Data ss:Type="String">status</Data></Cell><Cell ss:StyleID="sHeader"><Data ss:Type="String">comments</Data></Cell><Cell ss:StyleID="sHeader"><Data ss:Type="String">Customer No.</Data></Cell></Row>
<Row><Cell ss:StyleID="sNumber"><Data ss:Type="Number">0</Data></Cell><Cell><Data ss:Type="String">2010-08-20 00:00:00</Data></Cell><Cell><Data ss:Type="String"></Data></Cell><Cell><Data ss:Type="String">Open</Data></Cell><Cell><Data ss:Type="String">foo</Data></Cell><Cell ss:StyleID="sNumber"><Data ss:Type="Number">123456</Data></Cell></Row>
<Row><Cell ss:StyleID="sNumber"><Data ss:Type="Number">10100</Data></Cell><Cell><Data ss:Type="String">2003-01-06 00:00:00</Data></Cell><Cell><Data ss:Type="String">2003-01-10 00:00:00</Data></Cell><Cell><Data ss:Type="String">Shipped</Data></Cell><Cell><Data ss:Type="String">foo</Data></Cell><Cell ss:StyleID="sNumber"><Data ss:Type="Number">363</Data></Cell></Row>
<Row><Cell ss:StyleID="sNumber"><Data ss:Type="Number">10101</Data></Cell><Cell><Data ss:Type="String">2003-01-18 00:00:00</Data></Cell><Cell><Data ss:Type="String">2003-01-22 00:00:00</Data></Cell><Cell><Data ss:Type="String">Shipped</Data></Cell><Cell><Data ss:Type="String">Check on availability.</Data></Cell><Cell ss:StyleID="sNumber"><Data ss:Type="Number">128</Data></Cell></Row></Table>

Footer (can be hard coded)

<WorksheetOptions 
              xmlns="urn:schemas-microsoft-com:office:excel">
                <Print>
                    <ValidPrinterInfo />
                    <HorizontalResolution>800</HorizontalResolution>
                    <VerticalResolution>0</VerticalResolution>
                </Print>
                <Selected />
                <Panes>
                    <Pane>
                        <Number>3</Number>
                        <ActiveRow>1</ActiveRow>
                    </Pane>
                </Panes>
                <ProtectObjects>False</ProtectObjects>
                <ProtectScenarios>False</ProtectScenarios>
            </WorksheetOptions>
        </Worksheet>
        </Workbook>

You can simply hard code the header and footer XML, only the body will be generated dynamically. If you need align and other styles required. Try the same "reverse" engineering method again and figure out what need to add to the XML.

One advantage that I found this way is that you do not need to rely on API because literally everything can be mashed into a string. It works across different programming language as well. May not as flexible or powerful as the API, but for datagrid, with only table, rows and columns it is enough. At least for me.

Caracal answered 26/12, 2012 at 22:51 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.