Hi there,
I just started using Open XML SDK and created a program to generate XLSX. It works well but the only problem is that i get a warning message while opening the xlsx and then displays the data correctly.
"Excel was able to open the file by repairing or removing the unreadable content."
"Excel completed file level validation and repair. Some parts of this workbook may have been repaired or discarded."
/xl/worksheets/sheet1.xml
/xl/worksheets/sheet2.xml
I tried to windiff the xml generated xml after correction and before correction by office but in vain. I guess the problem is related to coding and could anyone please shed some light on this issue?
Thanks,
Holy
I post the code below and here is steps I do on the code.
1 .Open an XLSX file (from template with no data)
2. Set an value on a particular cell
3. Fill data on sheet1
4. Fill data on sheet2
public Stream Create(Stream fromXlsxTemplate, IDataReader data)
{
if (fromXlsxTemplate == null)
{
throw new ArgumentNullException("fromXlsxTemplate");
}
if (data == null)
{
throw new ArgumentNullException("data");
}
fromXlsxTemplate.Position = 0;
// Open SpreadSheet from Resource Stream (Open XML)
using (SpreadsheetDocument document = SpreadsheetDocument.Open(fromXlsxTemplate, true))
{
WorkbookPart wbPart = document.WorkbookPart;
Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().ElementAtOrDefault(0);
WorksheetPart wsPart =
(WorksheetPart)(wbPart.GetPartById(theSheet.Id));
while (data.Read())
{
WriteHeader(data, wbPart, wsPart);
}
data.NextResult();
//Write to Sheet 1
WriteSheet1(data, wsPart);
//Move to result for sheet2
data.NextResult();
Sheet sheetDettaglo = wbPart.Workbook.Descendants<Sheet>().ElementAtOrDefault(1);
WorksheetPart wsPartDet =
(WorksheetPart)(wbPart.GetPartById(sheetDettaglo.Id));
//Write to Sheet 2
WriteSheet2(data, wsPartDet);
}
return fromXlsxTemplate;
}
private void WriteHeader(IDataReader reader, WorkbookPart wbPart, WorksheetPart wsPart)
{
// A2 Cell
Cell a2Cell = wsPart.Worksheet.Descendants<Cell>().
Where(c => c.CellReference == "A2").FirstOrDefault();
if (a2Cell != null)
{
string a2CellValue = a2Cell.InnerText;
var stringTable = wbPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
if (stringTable != null)
{
a2CellValue = stringTable.SharedStringTable.ElementAt(int.Parse(a2CellValue)).InnerText;
}
a2Cell.DataType = CellValues.String;
a2Cell.CellValue = new CellValue(string.Format(a2CellValue, DateTime.Parse(reader.GetValue(0).ToString()).ToString("dd/MM/yyyy")));
}
}
private uint WriteSheet1(IDataReader reader, WorksheetPart wsPart)
{
SheetData sheetData = wsPart.Worksheet.GetFirstChild<SheetData>();
uint rowIdx = 6; // Start from row 6
while (reader.Read())
{
Row newRow = new Row() { RowIndex = new DocumentFormat.OpenXml.UInt32Value(rowIdx) };
//Value fo Cell Emissioni
Cell cell = new Cell() { StyleIndex = (UInt32Value)1U };
cell.DataType = CellValues.String;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("Emissioni")).ToString()); //
newRow.AppendChild(cell);
//Value fo Cell Operazioni
cell = new Cell() { StyleIndex = (UInt32Value)9U };
cell.DataType = CellValues.Number;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("Operazioni")).ToString());
newRow.AppendChild(cell);
//Value fo Cell Totale
cell = new Cell() { StyleIndex = (UInt32Value)9U };
cell.DataType = CellValues.Number;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("Totale")).ToString());
newRow.AppendChild(cell);
sheetData.Append(newRow);
rowIdx++;
}
return rowIdx;
}
private uint WriteSheet2(IDataReader reader, WorksheetPart wsPartDet)
{
uint rowIdx;
SheetData sheetDet = wsPartDet.Worksheet.GetFirstChild<SheetData>();
rowIdx = 2; // Start from row 2
while (reader.Read())
{
Row newRow = new Row() { RowIndex = new DocumentFormat.OpenXml.UInt32Value(rowIdx) };
//n_polizza
Cell cell = new Cell() { };
cell.DataType = CellValues.Number;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("n_polizza")).ToString());
newRow.AppendChild(cell);
//c_attivita
cell = new Cell() { };
cell.DataType = CellValues.String;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("c_attivita")).ToString());
newRow.AppendChild(cell);
//d_effetto
cell = new Cell() { };
cell.DataType = CellValues.Date;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("d_effetto")).ToString());
newRow.AppendChild(cell);
//descrizione
cell = new Cell() { };
cell.DataType = CellValues.String;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("descrizione")).ToString());
newRow.AppendChild(cell);
//tipo_liquidazione
cell = new Cell() { };
cell.DataType = CellValues.String;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("tipo_liquidazione")).ToString());
newRow.AppendChild(cell);
//d_carico
cell = new Cell() { };
cell.DataType = CellValues.Date;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("d_carico")).ToString());
newRow.AppendChild(cell);
//timestamp
cell = new Cell() { };
cell.DataType = CellValues.Date;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("timestamp")).ToString());
newRow.AppendChild(cell);
//d_assunzione
cell = new Cell() { };
cell.DataType = CellValues.Date;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("d_assunzione")).ToString());
newRow.AppendChild(cell);
//c_operazione_online
cell = new Cell() { };
cell.DataType = CellValues.String;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("c_operazione_online")).ToString());
newRow.AppendChild(cell);
//c_prodotto
cell = new Cell() { };
cell.DataType = CellValues.String;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("c_prodotto")).ToString());
newRow.AppendChild(cell);
//c_fondo
cell = new Cell() { };
cell.DataType = CellValues.Date;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("c_fondo")).ToString());
newRow.AppendChild(cell);
//descrizione_fondo
cell = new Cell() { };
cell.DataType = CellValues.Date;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("descrizione_fondo")).ToString());
newRow.AppendChild(cell);
//descrizione_prodotto
cell = new Cell() { };
cell.DataType = CellValues.Date;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("descrizione_prodotto")).ToString());
newRow.AppendChild(cell);
//importo
cell = new Cell() { };
cell.DataType = CellValues.Number;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("importo")).ToString());
newRow.AppendChild(cell);
//c_abi
cell = new Cell() { };
cell.DataType = CellValues.String;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("c_abi")).ToString());
newRow.AppendChild(cell);
//descrizione_lv
cell = new Cell() { };
cell.DataType = CellValues.String;
cell.CellValue = new CellValue(reader.GetValue(reader.GetOrdinal("descrizione_lv")).ToString());
newRow.AppendChild(cell);
sheetDet.Append(newRow);
rowIdx++;
}
return rowIdx;
}