Unable to insert cells into an Open XML document as the OpenXml Excel document. I think the issue is that the cell.Remove()
isn't actually clearing cell. I'm unsure because the document says that it has been modified
public static void InsertCell(uint rowIndex, int columnIndex, string value, SheetData sheetData, bool appendRow, EnumValue<CellValues> dataType = null, uint? styleIndex = null)
{
//Row row = null;
// Check if the worksheet contains a row with the specified row index.
var row = sheetData.Elements<Row>().FirstOrDefault(r => r.RowIndex == rowIndex);
if (row == null)
{
row = new Row() { RowIndex = rowIndex };
sheetData.Append(row);
}
// Convert column index to column name for cell reference.
var columnName = GetExcelColumnName(columnIndex);
var cellReference = columnName + rowIndex; // e.g. A1
// Check if the row contains a cell with the specified column name.
var cell = row.Elements<Cell>().FirstOrDefault(c => c.CellReference.Value == cellReference);
//We need to delete the cell if it does exist as the InsertAt function does not delete the existing cell if it has been found
if (cell != null)
{
cell.Remove();
//cell.CellValue.Remove();
}
if (cell == null || cell.CellValue == null)
{
if (dataType == null)
dataType = new EnumValue<CellValues>(CellValues.SharedString);
var newCell = new Cell() { CellReference = cellReference, CellValue = new CellValue(value), DataType = dataType };
if (styleIndex != null)
newCell.StyleIndex = styleIndex;
if (row.ChildElements.Count < columnIndex)
row.AppendChild(newCell);
else
row.InsertAt(newCell, (int)columnIndex);
}
}
Just for reference this is the calling code.
public static string AddToMaterialsRegister(SpreadsheetDocument spreadsheetDocument, com.upvise.client.Query query, JSONObject[] forms)
{
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
Stylesheet styleSheet = workbookPart.WorkbookStylesPart.Stylesheet;
var stringTable = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
string text = "";
uint currentRow = GetLastUsedRow(sheetData);
for (int i = 0; i < forms.Length; i += 1)
{
long epochDate = forms[i].getLong("date");
epochDate += 10 * 60 * 60 * 1000; //Add 10 hours to get to the QLD timezone
//The date from the form + 1970
epochDate = (epochDate / 1000 / 60 / 60 / 24) + 25569;
JObject customObj = JObject.Parse(forms[i].getString("value"));
string amount = (string)customObj["F4"];
if (!amount.Equals("") && amount != null)
{
switch ((string)customObj["F5"])
{
case "1":
amount += "T";
break;
case "0":
amount += "m3";
break;
}
}
else
amount = "";
// Not important
string tipValue = forms[i].getString("templateid") == "" ? (string)customObj["F18"] : (string)customObj["F19"];
//Grab the photos from the form
var files = query.selectFiles("Forms.forms", forms[i].getString("id") + ":F22");
//int dateIndex = InsertSharedStringItem(epochDate.ToString(), stringTable);
int materialIndex = InsertSharedStringItem((string)customObj["F1"], stringTable);
int amountIndex = InsertSharedStringItem(amount, stringTable);
int deliveredIndex = InsertSharedStringItem((string)customObj["F6"] + " " + (tipValue != null ? tipValue : ""), stringTable);
int certIndex = InsertSharedStringItem(files.Length > 0 ? "Y" : "", stringTable);
int formNameIndex = InsertSharedStringItem(forms[i].getString("name"), stringTable);
InsertCell(currentRow, 1, epochDate.ToString(), sheetData, false, new EnumValue<CellValues>(CellValues.Number), 2);
InsertCell(currentRow, 2, materialIndex.ToString(), sheetData, false, new EnumValue<CellValues>(CellValues.SharedString), 3);
InsertCell(currentRow, 3, amountIndex.ToString(), sheetData, false, new EnumValue<CellValues>(CellValues.SharedString), 3);
InsertCell(currentRow, 4, deliveredIndex.ToString(), sheetData, false, new EnumValue<CellValues>(CellValues.SharedString), 4);
InsertCell(currentRow, 5, certIndex.ToString(), sheetData, false, new EnumValue<CellValues>(CellValues.SharedString), 4);;
InsertCell(currentRow, 6, formNameIndex.ToString(), sheetData, true, new EnumValue<CellValues>(CellValues.SharedString), 4);
currentRow += 1;
}
//spreadsheetDocument.Save();
//spreadsheetDocument.Close();
//worksheetPart.Worksheet.Save();
//workbookPart.Workbook.Save();
return forms.Length + " forms were added";
}
When I run the code it does not add rows to the xlsx.
Any help would be greatly appreciated.
I commented out the Row row = null;
as that has wiping the row every time I inserted a new cell.