воскресенье, 26 сентября 2010 г.

Работа с Excel из C# (забираем из Excel данные)

Итак, начался новый учебный год (с чем кстати всех и поздравляю), появились новые курсы, новые проекты, поэтому продолжу излагать некторые, на мой взгляд интересные, вещи.

Сегодня я хотел бы поговорить о работе с Excel из C#.
Пара коментариев:
1. Я использую VS 2010 и Excel 2007.
2. Как я уже сказал, мне работа с Excel понадобилась в одном из проектов, поэтому примеры будут из этого проекта.



1. Для начала работы с Excel-ем, необходимо добавить ссылку на сборку Microsoft Excel 12.0 Object Library.
2. Подключаем с псевдонимом пространство имен:
using Excel = Microsoft.Office.Interop.Excel;
3. Загружаем в память новый экземпляр приложения:
Excel.Application excelApp = new Excel.Application();
excelApp.Visible = true// Отвечает за то, будет ли видимо приложен
4. Открываем ранее существующий документ:
excelApp.Workbooks.Open(_sourceFile.FullName);
А вот здесь, как уже увидили те кто раньше работали с Excel, радостная новость! Теперь c# поддерживает параметры по умолчанию! И никаких больше "миссинг валуе".
5. Свойство Workbooks, как это не странно, содержит открытые книги. Почитаем с первой страницы, первой открытой книги, строчки в список (да, я имею в виду именно первой, а не нулевой! Пользуясь случаем, передаю пламенный привет раработчикам Visual Basic, начинающих нуманацию элементов массива с 1).
            int row = 1;
            List<List<string>> maping = new List<List<string>>();
            Excel.Worksheet currentSheet = (Excel.Worksheet)excelApp.Workbooks[1].Worksheets[1];
            while (currentSheet.get_Range("A" + row).Value2 != null)
            {
                List<string> tempList = new List<string>();
                for (char column = 'A'; column < 'J'; column++)
                {
                    Excel.Range cell = currentSheet.get_Range(column + row);
                    tempList.Add(сell != null ? cell.Value2.ToString() : "");
                }
                maping.Add(tempList);
                row++;
            }
Вот таким нехитрым способом, мы отмапили из экселевского файла ячеки в двухмерный список, с которым дальше можно и работать, не прибегая, к всяким жутким ухищрениям.
Да, чуть не забыл, проверка в while, проверяет есть ли хоть что-то в первом столбце в текущей строке, если есть, то добро пожаловать в мапинг. если нет, то файл кончился (ну у меня просто файл такой, у вас может быть другое условие разбора. Например, нужно перетащить наперед заданное число строк, или как нибудь еще).
6. Закрываем Excel
excelApp.Quit();

На этом вроде бы и все, но как говорится: Следите за рекламой! В следующей части покажу как генерировать сложную таблицу (объединение ячеек и все такое) с нуля.

З.ы. Спасибо, одному моему коллеге, который напомнил, что надо писать в блог, а то что-то за лето, я действительно, расслабился...

1 комментарий:

  1. Нашел код для загрузки данных Excel в таблицу DataGridView:
    private void завантажитиToolStripMenuItem_Click_1(object sender, EventArgs e)
    {
    {
    {
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.DefaultExt = "*.xls;*.xlsx";
    ofd.Filter = "Microsoft Excel (*.xls*)|*.xls*";
    ofd.Title = "Выберите документ для загрузки данных";
    if (ofd.ShowDialog() != DialogResult.OK)
    {
    MessageBox.Show("Вы не выбрали файл для открытия", "Загрузка данных...", MessageBoxButtons.OK, MessageBoxIcon.Error);
    return;
    }

    String constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
    ofd.FileName + ";Extended Properties='Excel 12.0 XML;HDR=YES;IMEX=1';";

    System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection(constr);
    con.Open();
    DataSet ds = new DataSet();
    DataTable schemaTable = con.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
    string sheet1 = (string)schemaTable.Rows[0].ItemArray[2];
    string select = String.Format("SELECT * FROM [{0}]", sheet1);
    System.Data.OleDb.OleDbDataAdapter ad = new System.Data.OleDb.OleDbDataAdapter(select, con);
    ad.Fill(ds);
    DataTable dt = ds.Tables[0];
    con.Close();
    con.Dispose();
    dataGridView1.DataSource = dt;
    }
    Все работает, НО!!! К уже готовой таблице DataGridView добавляет еще одну таблицу со смещение данных вправо. ПОМОГИТЕ

    ОтветитьУдалить