[C#/C++] Wczytanie pliku excel do DataGridView


(Filip Siemieniecki) #1

Witam na zajęciach w Technikum otrzymałem zadanie domowe z programowania w C# .

Dostałem plik Excela (zapisany w wersji 2003) w którym znajdują się 3 kolumny z Autorem , Tytuł , Data Wydania dzieła literackiego.

Zawartość pliku -> http://img37.imageshack.us/img37/6673/listal.jpg

Zadanie polega na tym aby w Microsoft Visual C# 2008 Express Edition napisać mały programik pozwalający wczytać zawartość pliczku Excela do tabeli DataGridView w następujący sposób:

1) Bez żadnych modyfikacji po prostu tak jak jest zapisane w pliku .

2) Po wpisaniu w TextBox1 np : "William Szekspir" w DataGridView pojawią się tylko wiersze z dziełami podanego autora z datami wydania od najwcześniejszej do

najpóźniejszej .

3) Po wpisaniu daty np : "1623" w DataGridView zostaną wyświetlone tylko dane Autora i jego dzieła znajdujące się pod podaną datą

(wyświetlane alfabetyczny).

Czy ktoś mógł by mi udzielić pomocy na temat jak wczytać plik Excela do DataGridView tak aby wyglądało to jak w arkuszu

I jak można sobie poradzić z wyłuskaniem potrzebnych fragmentów pliku ?

Będę wdzięczny za każdą pomoc .


(Pszybiak) #2

Poniżej przykład jak można coś takiego zrobić, korzystając z bibliotek MS Office (musi on być zainstalowany na komputerze, na którym odpalamy program). Do projektu musi być dołączona referencja do zewnętrznej biblioteki Microsoft Office 10.0 Object Library (przy dodawaniu referencji, zakładka COM)

using Office = Microsoft.Office.Core;

using Excel = Microsoft.Office.Interop.Excel;

...

private string m_xlFileName = @"C:\plik.xls";

private Excel.Application m_xlApp; // obiekt aplikacji

private Excel.Range m_projectRange; // zakres danych do wczytania

private Excel.Workbook m_xlWorkbook; // dokument

private Excel.Worksheet m_xlWorksheet; // arkusz

private System.Object m_xx = System.Type.Missing;

...

void CzytajDane()

{

         m_xlApp = new Excel.Application();

         m_xlApp.DisplayAlerts = false;


         m_xlWorkbook = m_xlApp.Workbooks.Open(m_xlFileName,

             m_xx, m_xx, m_xx, m_xx, m_xx, m_xx, m_xx,

             m_xx, m_xx, m_xx, m_xx, m_xx, m_xx, m_xx);


        m_xlWorksheet = (Excel.Worksheet)m_xlWorkbook.Worksheets[0]; // 0 wskazuje na pierwszy arkusz


        string startCell = "A1"; // zakres danych do wczytania

        string endCell = "C20";

        m_projectRange = m_xlWorksheet.get_Range(startCell, endCell);


         Array projectCells = (Array)m_projectRange.Cells.Value2;


         dataGridView.ColumnCount = m_projectRange.Columns.Count; // dataGridView jest obiektem DataGridView

         dataGridView.RowCount = m_projectRange.Rows.Count;


         for (int i = 0; i < dataGridView.ColumnCount; i++)

         {

            for (int j = 0; j < dataGridView.RowCount; j++)

            {

               dataGridView[i, j].Value = projectCells.GetValue(j+1,i+1);

            }

         }

         m_xlApp.Quit();

}

W tym przykładzie dane są od razu wrzucane do DataGridView. W Twoim przypadku lepiej by było zrobić sobie klasę do przechowywania obiektów z XLS-a, zaczytać z pliku kolekcję takich obiektów i na ich podstawie odświeżać widok.

Oczywiście o wiele łatwiej byłoby w przypadku Office 2007. Tam dokument jest zapisany w postaci XML, dlatego przy użyciu OpenXML SDK można w łatwy sposób dostać się do każdego elementu dokumentu.


(Filip Siemieniecki) #3

Dzięki Bronek85 za odpowiedź i pomoc w moim problemie .

Widzę że sporo tego jest a jak by się miała sprawa z wczytaniem wspomnianego xmla lub pliku csv ?

Łatwiejsze mogło by być wykonanie i czy trzeba by było odwoływać się do samej aplikacji Microsoftu ?


(Pszybiak) #4

W przypadku OpenXml (Office 2007) nie trzeba mieć zainstalowanego pakietu Office. W tym przypadku nie musisz się odwoływać do samej aplikacji Excel, gdyż pliki *.xlsx zawierają w sobie zwykły XML.

Tutaj znajdziesz przykłady jak ich używać:

http://msdn.microsoft.com/pl-pl/library/bb332058(en-us).aspx

http://msdn.microsoft.com/en-us/library/dd452407.aspx

http://blogs.msdn.com/brian_jones/archive/2008/11/10/reading-data-from-spreadsheetml.aspx

http://blog.stuartwhiteford.com/?p=49


(Filip Siemieniecki) #5

Naprawdę przyda się to wszystko co podałeś w tych linkach :slight_smile:

Na razie postanowiłem zrobić programik na pliczku CSV potem będę próbował na innych .

Ma ktoś jakiś pomysł jak zrobić aby wyraz wpisany w textbox1 został wyszukany w pliku CSV i wyświetlona została cała linia Autor , Tytuł , Data w datagridzie ?

Powiedzmy wyszukanie " Kochanowski " tak wygląda to w pliku -> “Jan Kochanowski”,“Fraszki”,1584

Kod :

public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }


        private void Form1_Load(object sender, EventArgs e)

        {

            dataGridView1.Columns.Add("Autor", "Autor");

            dataGridView1.Columns.Add("Tytuł", "Tytuł");

            dataGridView1.Columns.Add("Data Wydania", "Data Wydania");


            CSV csvFile = new CSV("BAZA.csv");

            ArrayList contacts = csvFile.GetContacts();


            for (int i = 0; i < contacts.Count; i++)

            {

                object[] record = (object[])contacts[i];

                dataGridView1.Rows.Add(record);

            }

        }

        public class CSV

        {

            private StreamReader _reader;

            private ArrayList _contactCollection;

            private ArrayList _record;


            public CSV(string filename)

            {

                _reader = new StreamReader(filename);

            }

           public ArrayList GetContacts()

            {

                _contactCollection = new ArrayList();

                _record = new ArrayList();


                string line = "";


                while ((line = _reader.ReadLine()) != null)

                {

                    object[] record = line.Split(',');

                    _contactCollection.Add(record);

                }

               return _contactCollection;

            }

        }

    }

}