I have got column index for an excel column in a spreadsheet and need to delete the entire column using this column index. I am confined to use Open XML SDK 2.0.
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
namespace openXMLDemo
{
public class Program
{
public static void Main(string[] args)
{
string fileFullPath = @"path to the excel file here";
string sheetName = "excelsheet name here";
using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileFullPath, true))
{
Sheet sheet = document.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>().Where(s => s.Name == sheetName).FirstOrDefault();
if (sheet != null)
{
WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheet.Id.Value);
// This is where I am struggling....
// finding the reference to entire column with the use of column index
Column columnToDelete = sheet.GetFirstChild<SheetData>().Elements<Column>()
}
}
}
}
}
Open XML has no way of selecting columns unfortunately, so you need to iterate through each row and cells within to remove the data:
static void Main(string[] args)
{
string fileFullPath = @"C:\Book1.xlsx";
string sheetName = "Sheet1";
// Specify your column index and then convert to letter format
int columnIndex = 3;
string columnName = GetExcelColumnName(columnIndex);
using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileFullPath, true)) {
Sheet sheet = document.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>().Where(s => s.Name == sheetName).FirstOrDefault();
if (sheet != null) {
WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheet.Id.Value);
// Get all the rows in the workbook
IEnumerable<Row> rows = worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements<Row>();
// Ensure that there are actually rows in the workbook
if (rows.Count() == 0){
return;
}
// Select all the cells from each row where the column letter is equal to index
foreach (Row row in rows) {
var cellsToRemove = row.Elements<Cell>().Where(x => new String(x.CellReference.Value.Where(Char.IsLetter).ToArray()) == columnName);
foreach (var cell in cellsToRemove)
cell.Remove();
}
}
}
}
Helper function courtesy of https://stackoverflow.com/a/182924/5309534:
static string GetExcelColumnName(int columnNumber)
{
int dividend = columnNumber;
string columnName = String.Empty;
int modulo;
while (dividend > 0) {
modulo = (dividend - 1) % 26;
columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
dividend = (int)((dividend - modulo) / 26);
}
return columnName;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With