2013-11-12 5 views
1

Я пробовал этот код на .NET - для импорта файла excel в devxpress datagrid - и он работал нормально, но теперь мне нужно создать процедуру, выполняющую ту же работу на delphi. Я не знаю много о delphi, поэтому мне нужны некоторые идеи, как это сделать.Импорт файла excel в datagrid на delphi

public static DataTable ImportExcelXLS(string FileName, bool hasHeaders) 
    { 
     string HDR = hasHeaders ? "Yes" : "No"; 
     string strConn; 
     if (FileName.Substring(FileName.LastIndexOf('.')).ToLower() == ".xlsx") 
      strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName + ";Extended Properties=\"Excel 12.0;HDR=" + HDR + ";IMEX=0\""; 
     else 
      strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileName + ";Extended Properties=\"Excel 8.0;HDR=" + HDR + ";IMEX=0\""; 

     //DataSet output = new DataSet(); 

     using (OleDbConnection conn = new OleDbConnection(strConn)) 
     { 
      conn.Open(); 

       DataTable schemaTable = conn.GetOleDbSchemaTable(
       OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 

      foreach (DataRow schemaRow in schemaTable.Rows) 
      { 
       string sheet = schemaRow["TABLE_NAME"].ToString(); 

       if (!sheet.EndsWith("_")) 
       { 
        try 
        { 

         OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" + sheet + "]", conn); 
         cmd.CommandType = CommandType.Text; 

         DataTable outputTable = new DataTable(sheet); 

         new OleDbDataAdapter(cmd).Fill(outputTable); 

         if (outputTable.Rows.Count > 0) 
         { 
          return outputTable; 
         } 

        } 
        catch (Exception ex) 
        { 
         throw new Exception(ex.Message + string.Format("Sheet:{0}.File:F{1}", sheet, FileName), ex); 
        } 
       } 
      } 
     } 
     return null; 
    } 

ответ

1

У вас есть три основных варианта для Interop с таблицами Microsoft Excel

1) вы источник использует OLE DB для достижения данных. Это имеет три основных недостатка:

  • Microsoft ADO устарел, а библиотека ADF Delphi повреждена. У этих ошибок есть обходные пути, но вы будете тратить свое время на их обнаружение и изучение этих трюков.
  • Для этого требуется Microsoft Excel и не является бесплатной программой
  • Таблица - это не табличные данные, поэтому вы сможете читать только большинство упрощенных структурированных данных.

Но это быстро и удобно, если оно работает.

Вы также можете прочитать много учебников и как-тос. Например, с помощью BabelFish или GOOGLETRANSLATE вы можете попробовать http://devdelphi.ru/?p=63


2) Вы можете использовать запущенное приложение Excel как COM-сервер. Вам просто нужно отказаться от компонента ExcelApplication в вашей форме. См. C: \ RAD Studio \ 9.0 \ OCX \ Servers \

Это, возможно, самый обычный способ использования Excel. Она имеет несколько преимуществ:

  • COM интерфейсы являются естественным API для Excel, так что вы имели бы доступ к mopst своих возможностей
  • вы можете взять любой образец кода в Visual Basic или C++ и дословно перевести его на Delphi
  • Microsoft имеет много документации этого API
  • для большинства действий, которые вы можете использовать встроенные в Excel записи макросов, чтобы получить готовую программу, как сделать что-то в Excel
  • Обычно Excel предназначается, чтобы быть конечная власть - это какой-то файл действителен или нет. Таким образом, вы можете быть уверены, что ваша программа сможет прочитать любой файл. А если нет - вы можете обвинить Microsoft Excel в этом, а не в своей программе.
  • Возможно, проще сделать цикл по строкам, а затем по ячейкам, чем понять, что такое SQL и как его использовать.

Однако

  • Это необходимо установлен Microsoft Excel, и это не бесплатная программа
  • Это медленно. Даже используя массивы для передачи данных
  • для неанглоязычных мест, в COM-интерфейсе есть ошибки, связанные с ошибкой
  • В Delphi COM также есть некоторые ошибки.

Опять же, у вас есть много уроков об использовании этого компонента. И у вас есть много обучающих программ Microsoft об использовании Visual Basic для управления Excel

и так один. Если вы хотите изменить свой подход к этому - у вас будет LOT информации

2.1) Можно также использовать OpenOffice.org (запустить сервер scalc.exe, управляемый через COM или HTTP, так же, как вы запускаете excel.exe) для чтения/записи файлов Microsoft Office и некоторых веб-серверов. Но, возможно, я не видел такого подхода популярным. Так что просто упомянем об этом.


3) Есть некоторые Delphi-родной библиотеки, способные считывать/записывать файлы Excel непосредственно

  • Это, вероятно, самый быстрый способ, так это качается, когда у вас есть много данных
  • вы контролируете происходящее - вы всегда можете изменить библиотеку, просто замените свою собственную программу
  • Ваша программа становится автономной - ей не нужны ни сам Excel, ни драйверы Excel OLE DB.

Однако

  • Эти библиотеки всегда играют в догонялки с Excel, так что они поддерживают только подмножество своих функций, и, как правило, довольно узкий один
  • Даже форматы файлов: некоторые библиотеки поддерживают только XLS, некоторые - только XML и XLSX. Особенно дешевые или бесплатные.
  • Эти библиотеки, как и любая программа, имеют свои ошибки. И вы не сможете сказать: «Это как раз то, как работает Excel».
Смежные вопросы