Невозможно вставить ячейки в документ Open XML - PullRequest
1 голос
/ 04 февраля 2020

Невозможно вставить ячейки в открытый документ XML как открытый документ Xml Excel. Я думаю, проблема в том, что cell.Remove() на самом деле не очищает ячейку. Я не уверен, потому что документ говорит, что он был изменен

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);

    }
}

Просто для справки это код вызова.

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";
}

Когда я запускаю код, он не добавляет строки к xlsx.

Любая помощь будет принята с благодарностью.

Я закомментировал Row row = null;, поскольку он стирает строку каждый раз, когда я вставляю новую ячейку.

...