Чтение данных из объединенных столбцов / строк Excel с использованием C # - PullRequest
6 голосов
/ 14 марта 2012

Я пытаюсь прочитать данные из документа Excel в C # с помощью Microsoft Interof.

Пока что я могу загрузить документ и прочитать некоторые данные из него.Однако мне нужно прочитать данные из двух разных столбцов и вывести их в виде json (для вызова jquery ajax)

Я сделал быстрый прототип структуры моего документа Excel с надеждой, что он немноголегче объяснить; -)

enter image description here

Мой метод называется GetExcelDataByCategory(string categoryName), где параметр categoryName будет использоваться для поиска столбца, из которого будут получены данные.

Итак, то есть, если я делаю вызов с параметром «Категория 2», мне нужно получить все значения в строках столбцов C и соответствующих дат из столбца A, поэтомурезультат будет выглядеть следующим образом:

enter image description here

Который затем необходимо преобразовать / проанализировать в JSON.

Я искал все выше и ниже того, как достичьэто, но пока безуспешно :-( Я знаю, что могу использовать метод get_Range () для выбора диапазона, но, похоже, вам нужно явно указать методу, из какой строки и из какого столбца получать данные.То есть: get_Range ("A1, C1")

ЭтоМой первый опыт чтения данных из документа Excel, так что я думаю, есть чему поучиться ;-) Есть ли способ получить вывод для моего второго изображения?

Любая помощь / подсказка очень ценится!: -)

Заранее спасибо.

Всего наилучшего,

Бо

Ответы [ 2 ]

4 голосов
/ 14 марта 2012

Вот что я бы сделал:

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());
        }
    }
}

Это код, который я бы использовал для чтения Excel.Прямо сейчас он читает каждый столбец, который имеет заголовок (обозначенный тем, что находится в первом ряду), а затем все строки там.Это не совсем то, что вы просили (это не форматирует в JSON), но я думаю, что этого достаточно, чтобы перебить вас.


РЕДАКТИРОВАТЬ: похоже, есть несколько пустых ячеек, которыевызывают проблемы.Пустая ячейка будет NULL в Interop, и поэтому мы получим ошибки, если попытаемся вызвать Value2 или Value2.ToString (), так как они не существуют.Я добавил код, чтобы убедиться, что ячейка не нулевая, прежде чем что-то делать с ней.Это предотвращает ошибки.

0 голосов
/ 14 марта 2012

для разбора и создания Excel вы можете использовать ExcelDataReader: http://exceldatareader.codeplex.com/

и для json вы можете использовать json.net: http://json.codeplex.com/

Оба довольно просты в использовании. Просто взгляните на сайты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...