È possibile utilizzare OpenXML SDK per leggere i file Xlsx.
Per fare ciò è necessario aggiungere un riferimento alla libreria OpenXML che può essere eseguita tramite lo nuget package (sarà necessario anche un riferimento a WindowsBase). È quindi necessario caricare il foglio di calcolo, trovare il foglio che ti interessa e iterare le celle.
Ogni Cell
ha una proprietà CellFormula
che non sarà nulla se c'è una formula in quella cella.
Ad esempio, il codice seguente eseguirà l'iterazione di ciascuna cella e genererà una riga per ogni cella che ha una formula.restituirà true
se una cella contiene una formula; altrimenti restituirà false
:
public static bool OutputFormulae(string filename, string sheetName)
{
bool hasFormula = false;
//open the document
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filename, false))
{
//get the workbookpart
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
//get the correct sheet
Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).First();
if (sheet != null)
{
//get the corresponding worksheetpart
WorksheetPart worksheetPart = workbookPart.GetPartById(sheet.Id) as WorksheetPart;
//iterate the child Cells
foreach (Cell cell in worksheetPart.Worksheet.Descendants<Cell>())
{
//check for a formula
if (cell.CellFormula != null && !string.IsNullOrEmpty(cell.CellFormula.Text))
{
hasFormula = true;
Console.WriteLine("Cell {0} has the formula {1}", cell.CellReference, cell.CellFormula.Text);
}
}
}
}
return hasFormula;
}
Questo può essere chiamato con il nome del file e il nome del foglio che ti interessa, anche se sarebbe banale per aggiornare il codice per iterare tutti fogli. Un esempio di richiamo:
bool formulaExistsInSheet = OutputFormulae(@"d:\test.xlsx", "Sheet1");
Console.WriteLine("Formula exists? {0}", formulaExistsInSheet);
Un'uscita esempio da quanto sopra:
cella C1 ha la formula A1 + B1
cellulare B3 ha formula C1 * esiste 20
Formula? Vero
Se siete interessati solo se ci sono eventuali celle nel foglio che hanno una formula è possibile semplificare il sopra utilizzando il metodo Any
estensione:
public static bool HasFormula(string filename, string sheetName)
{
bool hasFormula = false;
//open the document
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filename, false))
{
//get the workbookpart
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
//get the correct sheet
Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).First();
if (sheet != null)
{
//get the corresponding worksheetpart
WorksheetPart worksheetPart = workbookPart.GetPartById(sheet.Id) as WorksheetPart;
hasFormula = worksheetPart.Worksheet.Descendants<Cell>().Any(c =>
c.CellFormula != null && !string.IsNullOrEmpty(c.CellFormula.Text));
}
}
return hasFormula;
}
Ci può spiegare che cosa c'è che non va con il tuo codice attuale? – aspiring
non c'è niente di sbagliato nel mio codice voglio solo un codice per controllare nel mio foglio excel c'è qualche formula in ogni cella. Attualmente sto usando il codice sopra per leggere Excel e convertire in tabella dati. – LuckyS
come so che se aggiungi una formula a una cella restituirà sempre qualcosa (non null) nel tuo caso, penso che tu possa controllare se il valore è nullo o nullo, devi dire se è un pensiero. – SMHasnain