//complete code sample using Mikes Knowlegebase libs
private static void WriteExcelFile(DataSet ds, SpreadsheetDocument spreadsheet)
{
// Create the Excel file contents. This function is used when creating an Excel file either writing
// to a file, or writing to a MemoryStream.
spreadsheet.AddWorkbookPart();
spreadsheet.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();
// My thanks to James Miera for the following line of code (which prevents crashes in Excel 2010)
spreadsheet.WorkbookPart.Workbook.Append(new BookViews(new WorkbookView()));
// If we don't add a "WorkbookStylesPart", OLEDB will refuse to connect to this .xlsx file !
WorkbookStylesPart workbookStylesPart = spreadsheet.WorkbookPart.AddNewPart<WorkbookStylesPart>();
//Stylesheet stylesheet = new Stylesheet(new CellFormats(
// new CellFormat(
// new Alignment() { Horizontal = HorizontalAlignmentValues.Left, Vertical = VerticalAlignmentValues.Center }
// ) { FontId = 0, FillId = 0, BorderId = 0, ApplyAlignment = true })
//);
Stylesheet stylesheet = ExcelStyleSheet.GenerateStyleSheet();
workbookStylesPart.Stylesheet = stylesheet;
workbookStylesPart.Stylesheet.Save();
// Loop through each of the DataTables in our DataSet, and create a new Excel Worksheet for each.
uint worksheetNumber = 1;
foreach (DataTable dt in ds.Tables)
{
// For each worksheet you want to create
string workSheetID = "rId" + worksheetNumber.ToString();
string worksheetName = dt.TableName;
WorksheetPart newWorksheetPart = spreadsheet.WorkbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet();
int numberOfColumns = dt.Columns.Count;
Columns columns = new Columns();
for (int n = 0; n < numberOfColumns; ++n)
{
//double widthTxt = OpenXMLUtils.GetWidth("Calibri", 11, strText);
double widthMax = GetMaxColWidth(n, dt);
Column column = new Column();
uint uCol = (uint)n + 1;
column.Min = uCol;
column.Max = uCol;
column.Width = widthMax;
columns.Append(column);
}
newWorksheetPart.Worksheet.Append(columns);
// create sheet data
newWorksheetPart.Worksheet.AppendChild(new DocumentFormat.OpenXml.Spreadsheet.SheetData());
// save worksheet
WriteDataTableToExcelWorksheet(dt, newWorksheetPart);
newWorksheetPart.Worksheet.Save();
// create the worksheet to workbook relation
if (worksheetNumber == 1)
spreadsheet.WorkbookPart.Workbook.AppendChild(new DocumentFormat.OpenXml.Spreadsheet.Sheets());
spreadsheet.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>().AppendChild(new DocumentFormat.OpenXml.Spreadsheet.Sheet() {
Id = spreadsheet.WorkbookPart.GetIdOfPart(newWorksheetPart),
SheetId = (uint)worksheetNumber,
Name = dt.TableName
});
worksheetNumber++;
}
spreadsheet.WorkbookPart.Workbook.Save();
}
private static double GetMaxColWidth(int colInx, DataTable dt)
{
string cellValue;
double cellLen = 0;
double maxCharLen = OpenXMLUtils.GetWidth("Calibri", 11, dt.Columns[colInx].ColumnName);
foreach (DataRow dr in dt.Rows)
{
if (dr.ItemArray[colInx].GetType() != typeof(System.DBNull))
{
if (dr.ItemArray[colInx].GetType() == typeof(System.DateTime))
{
cellValue = ((DateTime)dr.ItemArray[colInx]).ToString("M/d/yyyy hh:mm");
}
else
{
cellValue = dr.ItemArray[colInx].ToString();
}
cellLen = OpenXMLUtils.GetWidth("Calibri", 11, cellValue);
if (maxCharLen < cellLen)
{
maxCharLen = cellLen;
}
}
}
return maxCharLen;
}
private static void WriteExcelFile(DataSet ds, SpreadsheetDocument spreadsheet)
{
// Create the Excel file contents. This function is used when creating an Excel file either writing
// to a file, or writing to a MemoryStream.
spreadsheet.AddWorkbookPart();
spreadsheet.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();
// My thanks to James Miera for the following line of code (which prevents crashes in Excel 2010)
spreadsheet.WorkbookPart.Workbook.Append(new BookViews(new WorkbookView()));
// If we don't add a "WorkbookStylesPart", OLEDB will refuse to connect to this .xlsx file !
WorkbookStylesPart workbookStylesPart = spreadsheet.WorkbookPart.AddNewPart<WorkbookStylesPart>();
//Stylesheet stylesheet = new Stylesheet(new CellFormats(
// new CellFormat(
// new Alignment() { Horizontal = HorizontalAlignmentValues.Left, Vertical = VerticalAlignmentValues.Center }
// ) { FontId = 0, FillId = 0, BorderId = 0, ApplyAlignment = true })
//);
Stylesheet stylesheet = ExcelStyleSheet.GenerateStyleSheet();
workbookStylesPart.Stylesheet = stylesheet;
workbookStylesPart.Stylesheet.Save();
// Loop through each of the DataTables in our DataSet, and create a new Excel Worksheet for each.
uint worksheetNumber = 1;
foreach (DataTable dt in ds.Tables)
{
// For each worksheet you want to create
string workSheetID = "rId" + worksheetNumber.ToString();
string worksheetName = dt.TableName;
WorksheetPart newWorksheetPart = spreadsheet.WorkbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet();
int numberOfColumns = dt.Columns.Count;
Columns columns = new Columns();
for (int n = 0; n < numberOfColumns; ++n)
{
//double widthTxt = OpenXMLUtils.GetWidth("Calibri", 11, strText);
double widthMax = GetMaxColWidth(n, dt);
Column column = new Column();
uint uCol = (uint)n + 1;
column.Min = uCol;
column.Max = uCol;
column.Width = widthMax;
columns.Append(column);
}
newWorksheetPart.Worksheet.Append(columns);
// create sheet data
newWorksheetPart.Worksheet.AppendChild(new DocumentFormat.OpenXml.Spreadsheet.SheetData());
// save worksheet
WriteDataTableToExcelWorksheet(dt, newWorksheetPart);
newWorksheetPart.Worksheet.Save();
// create the worksheet to workbook relation
if (worksheetNumber == 1)
spreadsheet.WorkbookPart.Workbook.AppendChild(new DocumentFormat.OpenXml.Spreadsheet.Sheets());
spreadsheet.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>().AppendChild(new DocumentFormat.OpenXml.Spreadsheet.Sheet() {
Id = spreadsheet.WorkbookPart.GetIdOfPart(newWorksheetPart),
SheetId = (uint)worksheetNumber,
Name = dt.TableName
});
worksheetNumber++;
}
spreadsheet.WorkbookPart.Workbook.Save();
}
private static double GetMaxColWidth(int colInx, DataTable dt)
{
string cellValue;
double cellLen = 0;
double maxCharLen = OpenXMLUtils.GetWidth("Calibri", 11, dt.Columns[colInx].ColumnName);
foreach (DataRow dr in dt.Rows)
{
if (dr.ItemArray[colInx].GetType() != typeof(System.DBNull))
{
if (dr.ItemArray[colInx].GetType() == typeof(System.DateTime))
{
cellValue = ((DateTime)dr.ItemArray[colInx]).ToString("M/d/yyyy hh:mm");
}
else
{
cellValue = dr.ItemArray[colInx].ToString();
}
cellLen = OpenXMLUtils.GetWidth("Calibri", 11, cellValue);
if (maxCharLen < cellLen)
{
maxCharLen = cellLen;
}
}
}
return maxCharLen;
}
Comments
Post a Comment