Click here to Skip to main content
15,796,456 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I have code that reads in an Excel file (used as a template). The first row of this template is formatted properly but empty. I copy that row.

For each row that I want to add, I pasted a clone of the copied row and fill in the data.

It almost works. All of the data is there. But 1) something is corrupt about the new file, I get an error saying it needs to repair data, 2) the background of the added rows isn't the same as the first row and 3) more importantly the AutoFilter seems to only see one row, no matter what I do.

In my test data I have 6 rows and the column filters only have checkboxes for data that exists in the first row.

If I manually insert a row above the first row and change the data, then the autofilter corrects itself and shows options for the 2 rows.

Here is my code for adding the row:
row = (Row)copyRow.CloneNode(true);
row.RowIndex = rowCount;
foreach (var child in row.ChildElements)
       ((Cell)child).CellReference = Regex.Replace(((Cell)child).CellReference, @"\d+", rowCount.ToString());
 var lastRow = sd.Elements<Row>().LastOrDefault();
 //Either of these 2 calls should work.  I'm using insert because of AutoFilter
 lastRow.InsertAfterSelf(row);
 //sd.AppendChild(row);


And here is my code for correcting AutoFilter

foreach ( var td in ((WorksheetPart)wp).TableDefinitionParts)
{
   var af = td.Table.AutoFilter;
      if (af != null)
          af.Reference = $"A1:W{rowCount}";
}


What I have tried:

I've spent 3 days trying different options and nothing has worked. Basically I've had to reverse-engineer because I'm unable to find documentation that addresses this.
Posted
Comments
Gerry Schmitz 13hrs ago    
Sometimes it's better to replace the whole thing with a "memory copy" you've updated instead of trying to insert, etc. One assumes it's not an OpenXMl issue. You need an OpenXML "expert" in any case.
Sandy Jeakins 13hrs ago    
Thanks Gerry, it's a big spreadsheet with a bunch of pivot tables on other tabs. Otherwise I would. Thanks for the suggestion.
Gerry Schmitz 10hrs 15mins ago    
If it "almost works", then the concept of "refresh" comes to mind.

https://stackoverflow.com/questions/16818508/openxml-refresh-excel-sheet-after-cell-update
Maciej Los 1hr 10mins ago    
I'd suggest to use EPPlus NuGet package. It's very fast and light version of OpenXML/Excel.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900