readheader Lire les données des colonnes/lignes Excel combinées en utilisant C#




lire un fichier csv en c (2)

J'essaie de lire les données d'un document Excel en C # en utilisant Microsoft COM Interop.

Jusqu'à présent, je suis capable de charger le document et de lire quelques données. Cependant, j'ai besoin de lire les données de deux colonnes différentes et les afficher sous la forme json (pour un appel jquery ajax)

J'ai fait un prototype rapide de la façon dont mon document Excel est structuré avec l'espoir que c'est un peu plus facile à expliquer ;-)

La méthode que j'ai est appelée GetExcelDataByCategory(string categoryName) où le paramètre categoryName serait utilisé pour trouver de quelle colonne obtenir les données.

Donc, si je fais l'appel avec "Catégorie 2" comme paramètre, j'ai besoin d'obtenir toutes les valeurs dans les lignes des colonnes C et les dates correspondantes de la colonne A, donc la sortie ressemblera à ceci:

Ce qui doit ensuite être transformé / analysé en JSON.

J'ai recherché haut et bas sur la façon d'y parvenir, mais sans aucune chance jusqu'à présent :-( Je suis conscient que je peux utiliser la méthode get_Range () pour sélectionner une plage, mais il semble que vous devez explicitement dire à la méthode quelle ligne et quelle colonne utiliser pour obtenir les données: Ie: get_Range ("A1, C1")

C'est ma première expérience de lecture de données à partir d'un document Excel, donc je suppose qu'il y a beaucoup à apprendre ;-) Y a-t-il un moyen d'obtenir la sortie sur ma deuxième image?

Toute aide / indice est grandement appréciée! :-)

Merci d'avance.

Bonne chance,

Bo


C'est ce que je ferais:

using Excel = Microsoft.Office.Interop.Excel;

Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open("path to book");
Excel.Worksheet xlSheet = xlWorkbook.Sheets[1]; // get first sheet
Excel.Range xlRange = xlSheet.UsedRange; // get the entire used range

int numberOfRows = xlRange.Rows.Count;
int numberOfCols = xlRange.Columns.Count;
List<int> columnsToRead = new List<int>();
// find the columns that correspond with the string columnName which
// would be passed into your method
for(int i=1; i<=numberOfCols; i++)
{
    if(xlRange.Cells[1,i].Value2 != null) // ADDED IN EDIT
    {
        if(xlRange.Cells[1,i].Value2.ToString().Equals(categoryName))
        {
            columnsToRead.Add(i);
        }
    }
}
List<string> columnValue = new List<string>();
// loop over each column number and add results to the list
foreach(int c in columnsToRead)
{
    // start at 2 because the first row is 1 and the header row
    for(int r = 2; r <= numberOfRows; r++)
    {
        if(xlRange.Cells[r,c].Value2 != null) // ADDED IN EDIT
        {
            columnValue.Add(xlRange.Cells[r,c].Value2.ToString());
        }
    }
}

C'est le code que j'utiliserais pour lire l'Excel. En ce moment, il lit chaque colonne qui a le titre (désigné par tout ce qui est dans la première rangée) et ensuite toutes les lignes là-bas. Ce n'est pas exactement ce que vous avez demandé (il n'est pas formaté en JSON) mais je pense que c'est suffisant pour vous dépasser.

EDIT: On dirait qu'il y a quelques cellules vides qui causent des problèmes. Une cellule vide sera NULL dans l'Interop et ainsi nous obtenons des erreurs si nous essayons d'appeler Value2 ou Value2.ToString () puisqu'elles n'existent pas. J'ai ajouté du code pour vérifier que la cellule n'est pas nulle avant de faire quoi que ce soit avec elle. Il empêche les erreurs.






com