Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C# Exel tiedoston lukeminen

make3003 [05.03.2009 10:23:14]

#

Tervehdys,

Minun pitäisi saada haettua exel tiedoston rivit A2:A40 tiedot taulukkoon.
Sarakkeiden tiedon määrä voi vaihdella, eli niitä voi olla alle 30 myös.

Osaan kyllä hakea vain yhden sarakkeen(A2:A2) kerrallaan, tietenkin voisi tehdä silmukan joka kävisi kyseiset rivit läpi, mutta uskoisin että se voidaan tehdä helpomminkin, vai?

Ohjelma käy ainakin 7 saraketta ja enemmän rivejä läpi.

neau33 [12.03.2009 06:31:57]

#

Heippa make3003!

projektiin refernssit...
CAG:
ADODB
Microsoft.Office.Interop.Excel
System
System.Data
System.Drawing
System.Windows.Forms
System.Xml
COM:
ADOX (Microsoft Ext.2.8 for DLL and Security)

lomakkeelle:
1 DataGridView (DataGridView1)
3 nappia (Button1, Button2 & Button3)
Button1.Text: GetFromExelUsingPIAs
Button2.Text: GetFromExcelUsingOleDb
Button3.Text: WriteToExel

using System;
using System.Data;
using System.Data.OleDb;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Windows.Forms;

using Excel = Microsoft.Office.Interop.Excel;

namespace ExcelToDataSet
{

   public partial class Form1 : Form
   {
      public int xlCase = 0;

      public Form1() {
         InitializeComponent();
      }


      Private void Button1_Click(object sender, EventArgs e)
      {
         DisableButtons();
         GetFromExcelUsingPIAs();
         EnableButtons();
      }

      Private  Button2_Click(object sender, EventArgs e)
      {
         DisableButtons();
         GetFromExcelUsingOleDb();
         EnableButtons();
      }

      Private void Button3_Click(object sender, EventArgs e)
      {
         switch (xlCase) {
            case 1:
               DisableButtons();
               WriteToExcelUsingPIAs();
               EnableButtons();
               break;
            case 2:
               DisableButtons();
               WriteToExcelUsingOleDb();
               EnableButtons();
               break;
         }
      }

      public void GetFromExcelUsingPIAs()
      {

         string fullPath = "C:\\Työkirja1.xls";

         Excel.Application xlApp = new Excel.Application();
         Excel.Workbook  xlBook =
         (Excel.Workbook)(xlApp.Workbooks.Add(fullPath));
         Excel.Worksheet xlSheet = (Excel.Worksheet)xlBook.Worksheets[1];
         xlSheet.Application.Visible = false;
         if (xlSheet == null)
         {
            fullPath = null;
            xlApp = null;
            xlBook = null;
            xlSheet = null;
            KillExcelProcess();
            MessageBox.Show("Tiedonsiirrossa tapahtui odottamaton virhe!");
            return;
         }
         else
         {
            DataSet xlDataSet = new DataSet();
            DataTable xlTable = xlDataSet.Tables.Add(xlSheet.Name);
            int i = 0;
            int j = 0;

            int CurrentRangeColumns = xlSheet.UsedRange.Columns.Count;
            int CurrentRangeRows = xlSheet.UsedRange.Rows.Count;

            for (i = 1; i <= CurrentRangeColumns; i++) {
               DataColumn xlColumn = new DataColumn();
               xlColumn.DataType = Type.GetType("System.Object");
               string[] xlColumnName = ((Excel.Range)xlSheet.Cells[1, i])
               .get_Address(Missing.Value,Missing.Value, Excel.
               XlReferenceStyle.xlA1 ,Missing.Value,Missing.Value).Split('$');

               xlColumn.ColumnName = xlColumnName[1];
               xlTable.Columns.Add(xlColumn);
               xlColumnName = null;
               xlColumn = null;
            }

         for (i = 1; i <= CurrentRangeRows; i++) {
            DataRow xlRow = xlTable.NewRow();
            for (j = 1; j <= CurrentRangeColumns; j++) {

               xlRow[j - 1] = ((Excel.Range)xlSheet.Cells[i, j])
               .get_Value(Excel.XlRangeValueDataType.xlRangeValueDefault);
            }
            xlTable.Rows.Add(xlRow);
            xlRow = null;
         }
         i = 0;

         dataGridView1.DataSource = xlDataSet.Tables[xlSheet.Name];

         CurrentRangeRows = 0;
         CurrentRangeColumns = 0;
         xlSheet = null;
         xlBook = null;
         xlApp = null;
         fullPath = null;
         KillExcelProcess();
         xlCase = 1;
      }

   }

   public void WriteToExcelUsingPIAs()
   {

      string fullPath = "C:\\Työkirja1.xls";
      DirectoryInfo Dir = new DirectoryInfo("C:\\");
      FileInfo[] finfo = Dir.GetFiles("Työkirja1.xls");

      if (finfo.Length == 0) {
         Excel.Application xlNewApp;
         Excel.Workbook xlNewBook;
         Excel.Worksheet xlNewSheet;
         try {
            xlNewApp = new Excel.Application();
            xlNewBook = (Excel.Workbook)(xlNewApp.Workbooks.Add(fullPath));
            xlNewSheet = (Excel.Worksheet)xlNewBook.Worksheets.get_Item(1);
            xlNewApp.DisplayAlerts = false;
            xlNewBook.SaveAs(fullPath, Microsoft.Office.Interop.
            Excel.XlFileFormat.xlWorkbookNormal,
            null, null, false, false, Microsoft.Office.Interop.Excel
            .XlSaveAsAccessMode.xlShared, false, false,null,null,null);
            xlNewApp.DisplayAlerts = true;
            KillExcelProcess();
         }
         catch
         {
            xlNewSheet = null;
            xlNewBook = null;
            xlNewApp = null;
            KillExcelProcess();
            MessageBox.Show("Tapahtui odottamaton virhe luotaessa tiedostoa"
            + fullPath + "!");
            fullPath = null;
            return;
         }

      }

      Excel.Application xlApp = new Excel.Application();

      Excel.Workbook xlBook = (Excel.Workbook)xlApp.Workbooks.Add(fullPath);

      Excel.Worksheet xlSheet = (Excel.Worksheet)xlBook.Worksheets.get_Item(1);

      xlSheet.Application.Visible = false;

      if (xlSheet == null) {
         xlApp = null;
         xlBook = null;
         xlSheet = null;
         KillExcelProcess();
      }

      dataGridView1.ClearSelection();
      bool changed = false;
      int i = 0;

      for (i = 0; i <= dataGridView1.RowCount - 1; i++) {
         int j = 0;
         dataGridView1.Rows[i].Selected = true;
         for (j = 0; j <= dataGridView1.ColumnCount - 1; j++) {
            if (dataGridView1.SelectedCells[j].Value
            != xlSheet.Cells[i + 1, j + 1]) {
               ((Excel.Range)xlSheet.Cells[i + 1, j + 1]).set_Value(
               Excel.XlRangeValueDataType.xlRangeValueDefault,
               dataGridView1.SelectedCells[j].Value);

               if (changed == false) {
                  changed = true;
               }
            }
         }
         j = 0;
         dataGridView1.Rows[i].Selected = false;
      }
      i = 0;

      if (changed) {
         xlApp.DisplayAlerts = false;
         xlBook.SaveAs(fullPath, Microsoft.Office.Interop
         .Excel.XlFileFormat.xlWorkbookNormal,
         null, null, false, false, Microsoft.Office.Interop
         .Excel.XlSaveAsAccessMode.xlShared, false, false,null,null,null);
         xlApp.DisplayAlerts = true;
      }

      fullPath = null;
      xlApp = null;
      xlBook = null;
      xlSheet = null;
      KillExcelProcess();

   }

   public void KillExcelProcess()
   {
      Process[] xlProcess = Process.GetProcessesByName("Excel");

      if ((xlProcess != null)) {
         int i = 0;
         for (i = xlProcess.GetLowerBound(0);
         i <= xlProcess.GetUpperBound(0); i++)
         {
            try {
               xlProcess[i].Kill();
            }
            catch  {}
         }
         i = 0;
      }

      xlProcess = null;

   }

   public void GetFromExcelUsingOleDb()
   {

      string fullPath = "C:\\Työkirja1.xls";
      DirectoryInfo Dir = new DirectoryInfo("C:\\");
      FileInfo[] finfo = Dir.GetFiles("Työkirja1.xls");
      if (finfo.Length == 0 ) {
         fullPath = null;
         MessageBox.Show("Tiedostoa " + fullPath + " ei löydy!");
         return;
      }

      DataSet xlDataSet = new DataSet();
      string constr = "Provider=Microsoft.Jet.OLEDB.4.0;"
      + "Data Source=" + fullPath + "; Extended Properties=\"Excel 8.0;\"";
      OleDbDataAdapter xlDataAdapter =
      new OleDbDataAdapter("SELECT * FROM [Taul1$]", constr);
      xlDataAdapter.Fill(xlDataSet, "Taul1");
      dataGridView1.DataSource = xlDataSet.Tables["Taul1"];
      xlCase = 2;

   }

   public void WriteToExcelUsingOleDb()
   {

      string fullPath = "C:\\Työkirja1.xls";
      string constr = "Provider=Microsoft.Jet.OLEDB.4.0;"
      + "Data Source=" + fullPath + ";Extended Properties=Excel 8.0";
      int i = 0;
      DirectoryInfo Dir = new DirectoryInfo("C:\\");
      FileInfo[] finfo = Dir.GetFiles("Työkirja1.xls");
      if (finfo.Length == 0) {
         ADODB.Connection aconn = new ADODB.Connection();
         ADOX.Table tbl = new ADOX.Table();
         ADOX.Column col = new ADOX.Column();
         ADOX.Catalog cat = new ADOX.Catalog();
         aconn.Open(constr,"","",0);
         cat.ActiveConnection = aconn;
            for (i = 1; i <= 3; i++) {
               tbl = new ADOX.Table();
               tbl.Name = "Taul" + i.ToString();
               int j = 0;
               for (j = 0; j <= dataGridView1.ColumnCount - 1; j++)
               {
                  col = new ADOX.Column();
               {
                  col.Name = "F" + (j + 1).ToString();
                  col.Type = ADOX.DataTypeEnum.adDouble;
               }
               tbl.Columns.Append(col, col.Type, 0);
               col = null;
               }
               j = 0;
               cat.Tables.Append(tbl);
               tbl = null;
            }
            aconn.Close();
            aconn = null;
            cat = null;
            tbl = null;
         }

         DataSet ds = new DataSet();
         OleDbConnection oconn = new OleDbConnection(constr);
         oconn.Open();
         fullPath = null;
         string query = "Select * From [Taul1$]";
         OleDbDataAdapter da = new OleDbDataAdapter(query, oconn);
         OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
         da.Fill(ds, "Taul1");

         if (ds.Tables["Taul1"].Columns.Count < dataGridView1.ColumnCount)
         {
            for (i = ds.Tables["Taul1"].Columns.Count;
            i <= dataGridView1.ColumnCount - 1; i++) {
               DataColumn dcol = new DataColumn();
               dcol.ColumnName = dataGridView1.Columns[i].Name;
               dcol.DataType = ds.Tables["Taul1"].Columns[i].DataType;
               ds.Tables["Taul1"].Columns.Add(dcol);
               dcol = null;
            }
         }

         dataGridView1.ClearSelection();
         for (i = 0; i <= dataGridView1.RowCount - 1; i++) {
            int j = 0;
            dataGridView1.Rows[i].Selected = true;
            DataRow drow = ds.Tables["Taul1"].NewRow();
            for (j = 0; j <= dataGridView1.ColumnCount - 1; j++) {
               if ((dataGridView1.SelectedCells[j].Value != null)) {
                  drow[j] = dataGridView1.SelectedCells[j].Value;
               }
               else {
                  drow[j] = OleDbType.Empty;
               }
            }
            j = 0;
            dataGridView1.Rows[i].Selected = false;
            ds.Tables["Taul1"].Rows.Add(drow);
            drow = null;
         }
         i = 0;
         da.Update(ds, "Taul1");
         oconn.Close();
         oconn = null;
         constr = null;
         cb = null;
         da = null;
         ds = null;

      }

      public void DisableButtons()
      {
         button1.Enabled = false;
         button2.Enabled = false;
         button3.Enabled = false;
      }

      public void EnableButtons()
      {
         button1.Enabled = true;
         button2.Enabled = true;
      }

      void DataGridView1CellMouseDoubleClick(
      object sender, DataGridViewCellMouseEventArgs e)
      {
         switch (xlCase) {
            case  0:
            button3.Enabled = true;
            break;
         }
      }

      void MainFormFormClosing(object sender, FormClosingEventArgs e)
      {
         this.Dispose();
      }

      void MainFormFormClosed(object sender, FormClosedEventArgs e)
      {
         System.Environment.Exit(0);
      }
   }
}

-Nea

make3003 [17.03.2009 18:27:47]

#

Kiitos, taas oppi jotain uutta. Tästä on hyvä jatkaa eteenpäin.

make3003 [24.03.2009 21:11:57]

#

Olen testaillut tuota koodia ja olen törmännyt sellaiseen ongelmaan, että kun yritää kirjoittaa OleDB avulla, se heittää virhettä "Syntaksivirhe INSERT INTO -lauseessa." ja näyttää riviä "da.Update(ds, "Taul1");" olen yrittänyt etsiä netistä tähä apua mutta tuloksetta.

neau33 [26.03.2009 08:14:08]

#

Heippa taas make3003!

No tässä tulosta Nettiin elikäs toimiva OleDb UPDATE-viritelmä...

Huomaa, että OleDb-yhteys pudottaa tuonnin yhteydessä automaattisesti Excel-taulusta valitun alueen ensimmäisen rivin jos taulusta valitun alueen ensimmäinen rivi ei sisällä sarakeotsikoita ja nimeää sarakkeet tyyliin F1, F2, ... (field 1,...)

public void WriteToExcelUsingOleDb(){

   dataGridView1.AllowUserToAddRows = false;
   string fullPath = "C:\\Työkirja1.xls";

   string constr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +_
   fullPath + ";Extended Properties=\"Excel 8.0;HDR=Yes;\"";

   DataSet ds = new DataSet();
   OleDbConnection oconn = new OleDbConnection(constr);
   string query = "SELECT * FROM [Taul1$]";
   OleDbDataAdapter da = new OleDbDataAdapter(query, oconn);

   oconn.Open();
   da.Fill(ds, "Taul1$");

   OleDbCommand cmd = new OleDbCommand();
   dataGridView1.AllowUserToAddRows = false;
   cmd.Connection = oconn;
   dataGridView1.ClearSelection();
   for (int i = 0; i <= dataGridView1.RowCount - 2; i++) {

   	dataGridView1.Rows(i).Selected = true;
   	string cmdstr = "UPDATE [Taul1$] SET ";

   	for (int j = 0; j <= dataGridView1.ColumnCount - 1; j++) {

      bool dtype = false;

      cmdstr += dataGridView1.Columns(j).Name;
      dtype = ((dataGridView1.SelectedCells(0).Value) is System.String);
      switch (dtype) {
      	case true:
         cmdstr += " = '" + (string)dataGridView1.SelectedCells(j).Value + "'";
         break;
      	case false:
         cmdstr += " = " + (string)dataGridView1.SelectedCells(j).Value;
         break;
      }

      if (j < dataGridView1.ColumnCount - 1) {
      	cmdstr += ", ";
      }
      if (j == dataGridView1.ColumnCount - 1) {
      	cmdstr += " WHERE " + dataGridView1.Columns(0).Name;

      	dtype = ((dataGridView1.SelectedCells(0).Value) is System.String);
      	switch (dtype) {
         case true:
         cmdstr += " = '" + (string)dataGridView1.SelectedCells(0).Value + "'";
         break;
         case false:
         cmdstr += " = " + (string)dataGridView1.SelectedCells(0).Value;
         break;
      	}

      }
   	}
   	cmd.CommandText = cmdstr;
   	cmd.ExecuteNonQuery();
   	cmdstr = null;
   	dataGridView1.Rows(i).Selected = false;
   }

   da.Fill(ds, "Taul1$");
   da = null;
   constr = null;
   oconn.Close();
   oconn = null;
}

make3003 [29.03.2009 17:14:31]

#

Tervehdys,

Tuohan päivittää tällä hetkellä vain jos tiedostossa on ensimmäisessä sarakkeessa jotakin tekstiä, mutta ei lisää uutta riviä, vai olenko tehnyt jotain väärää?

ja toinen kysymys
nyt kun avaan tiedoston oledb yhteydellä ja lataan tiedot dataGridView1,
miten voidaan lisätä siihen uusia rivejä.
Tarkoitus on tehdä lisätyökalu yhteen ohjelmaan pissä klikataan hiirellä piste ja sen pitäisi lisätä aina rivi ID, X , Y, Z.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta