Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Open XML: Delete entire excel column using column index

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>()
                }
            }
        }
    }    
}
like image 868
Devraj Gadhavi Avatar asked Jan 30 '23 00:01

Devraj Gadhavi


1 Answers

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;
}
like image 65
Chawin Avatar answered Feb 02 '23 10:02

Chawin