Как извлечь данные из Excel не открывая файл? - C#

Узнай цену своей работы

Формулировка задачи:

ВОПРОС Как извлечь данные из Excel не открывая файл? СЦЕНАРИЙ 1. В поле "ID" вводим значение "ID" (ID - записи восьмизначное число) 2. В поле "СОДЕРЖАНИЕ ЗАПИСИ" появляется запись из базы данных, которое соответсnвует ID. Прилагаю болванку для кода
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. namespace ExcelDb
  11. {
  12. public partial class Form1 : Form
  13. {
  14. public Form1()
  15. {
  16. InitializeComponent();
  17. }
  18. private void Form1_Load(object sender, EventArgs e)
  19. {
  20. }
  21. private void groupBox2_Enter(object sender, EventArgs e)
  22. {
  23. }
  24. private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
  25. {
  26. }
  27. }
  28. }
ПРИЛОЖЕНИЕ. 1. Проект

Решение задачи: «Как извлечь данные из Excel не открывая файл?»

textual
Листинг программы
  1. class WorkBookWorker {
  2.         readonly List<SheetWorker> _sheetInfos = new List<SheetWorker>();
  3.         readonly OleDbConnection _connection;
  4.         public WorkBookWorker(string filePath) {
  5.  
  6.             _connection = new OleDbConnection(
  7.                 "provider=Microsoft.Jet.OLEDB.4.0;" +
  8.                 "data source=" + filePath +
  9.                 ";Extended Properties=Excel 8.0;"
  10.                 );
  11.             _connection.Open();
  12.        
  13.             var adapter = new OleDbDataAdapter(
  14.                     "select * from [Clients$]", _connection);
  15.             var table = new DataTable();
  16.             adapter.Fill(table);
  17.  
  18.             string fileName = new FileInfo(filePath).Name;
  19.             var sheets = table.Rows.Cast<DataRow>().Select(row => row.Field<string>(1)).Distinct();
  20.             foreach (var sheet in sheets) {
  21.                 if (sheet == null) continue;
  22.                 SheetWorker sheetInfo = new SheetWorker(_connection, sheet, fileName);
  23.                 if(sheetInfo.isCorrect) _sheetInfos.Add(sheetInfo);
  24.             }
  25.             }
  26.  
  27.         public List<ProtocolRow> FindRows(Func<ProtocolRow, bool> rule) {
  28.             List<ProtocolRow> rows = new List<ProtocolRow>();
  29.             foreach (var sheet in _sheetInfos) {
  30.                 sheet.FindRows(rule, ref rows);
  31.             }
  32.             return rows;
  33.         }
  34.  
  35.  
  36.         public List<ProtocolRow> FindRows(Func<string, bool> rule)
  37.         {
  38.             List<ProtocolRow> rows = new List<ProtocolRow>();
  39.             foreach (var sheet in _sheetInfos)
  40.             {
  41.                 sheet.FindRows(rule, ref rows);
  42.             }
  43.             return rows;
  44.                
  45.         }
  46.  
  47.  
  48.         public void ReplaceRows(Func<string, bool> rule, Func<string, string> convertor) {
  49.             foreach (var sheet in _sheetInfos) {
  50.                 sheet.ReplaceRows(rule, convertor, _connection);
  51.             }
  52.             _connection.Close();
  53.         }
  54.     }
  55. class SheetWorker {
  56.         readonly DataTable _table;
  57.         public readonly bool isCorrect = true;
  58.         public readonly string fileName;
  59.         public readonly string sheetName;
  60.  
  61.  
  62.         public SheetWorker(OleDbConnection connection, string sheetName, string fileName) {
  63.             this.fileName = fileName;
  64.             this.sheetName = sheetName;
  65.             var adapter =
  66.                 new OleDbDataAdapter(
  67.                     "select * from [" + sheetName + "$]", connection);
  68.             _table = new DataTable();
  69.             try {
  70.                 adapter.Fill(_table);
  71.             } catch (Exception) {
  72.                 isCorrect = false;
  73.             }
  74.  
  75.         }
  76.  
  77.         public void FindRows(Func<ProtocolRow, bool> rule, ref List<ProtocolRow> rows) {
  78.             rows.AddRange(
  79.                 _table.Rows.Cast<DataRow>().Select(row => new ProtocolRow(row, this)).Where(rule));
  80.         }
  81.  
  82.         public void FindRows(Func<string, bool> rule, ref List<ProtocolRow> rows) {
  83.             rows.AddRange(
  84.                 _table.Rows.Cast<DataRow>().
  85.                     Where(row => (row.ItemArray.Length > 5 && rule(row[5].ToString())) || (row.ItemArray.Length > 6 && rule(row[6].ToString()))).
  86.                     Select(row => new ProtocolRow(row, this)).ToArray());
  87.         }
  88.  
  89.  
  90.         public void ReplaceRows(Func<string, bool> selectionRule, Func<string, string> stringConvertor, OleDbConnection connection) {
  91.             Func<DataRow, bool> rule = row => row.ItemArray.Length > 5 && selectionRule(row[5].ToString());
  92.             var correctRows = _table.Rows.Cast<DataRow>().Where(rule).Distinct().ToArray();
  93.  
  94.             if (correctRows.Any()) {
  95.                 StringBuilder builder = new StringBuilder("Update [");
  96.                 builder.Append(sheetName);
  97.                 builder.Append("$] Set ");
  98.                 builder.Append(_table.Columns[5].ColumnName);
  99.                 builder.Append(" = '");
  100.  
  101.                 foreach (var correctRow in correctRows) {
  102.                     StringBuilder commandStr = new StringBuilder(builder.ToString());
  103.  
  104.                     string oldRowName = correctRow[5].ToString();
  105.                     string rowName = stringConvertor(oldRowName);
  106.  
  107.                     commandStr.Append(rowName);
  108.                     commandStr.Append("' Where ");
  109.                     commandStr.Append(_table.Columns[5].ColumnName);
  110.                     commandStr.Append(" = '");
  111.                     commandStr.Append(oldRowName);
  112.                     commandStr.Append("'");
  113.  
  114.                     OleDbCommand command = new OleDbCommand(commandStr.ToString(), connection);
  115.                     command.ExecuteNonQuery();
  116.                 }
  117.             }
  118.  
  119.             rule = row => row.ItemArray.Length > 6 && selectionRule(row[6].ToString());
  120.             correctRows = _table.Rows.Cast<DataRow>().Where(rule).Distinct().ToArray();
  121.  
  122.             if (correctRows.Any()) {
  123.                 StringBuilder builder = new StringBuilder("Update [");
  124.                 builder.Append(sheetName);
  125.                 builder.Append("$] Set ");
  126.                 builder.Append(_table.Columns[6].ColumnName);
  127.                 builder.Append(" = '");
  128.  
  129.                 foreach (var correctRow in correctRows) {
  130.                     StringBuilder commandStr = new StringBuilder(builder.ToString());
  131.  
  132.                     string oldRowName = correctRow[6].ToString();
  133.                     string rowName = stringConvertor(oldRowName);
  134.  
  135.                     commandStr.Append(rowName);
  136.                     commandStr.Append("' Where ");
  137.                     commandStr.Append(_table.Columns[6].ColumnName);
  138.                     commandStr.Append(" = '");
  139.                     commandStr.Append(oldRowName);
  140.                     commandStr.Append("'");
  141.  
  142.                     OleDbCommand command = new OleDbCommand(commandStr.ToString(), connection);
  143.                     command.ExecuteNonQuery();
  144.                 }
  145.             }
  146.         }
  147.     }
  148. class ProtocolRow {
  149.        
  150.         public string Output { get; set; }
  151.         public string ByteNumber { get; set; }
  152.         public string Type { get; set; }
  153.  
  154.         public string CustomName { get; set; }
  155.         public string ServerName { get; set; }
  156.         public string ClientName { get; set; }
  157.  
  158.         SheetWorker _sheetInfo;
  159.  
  160.         public string SheetName {
  161.             get { return _sheetInfo.sheetName; }
  162.         }
  163.  
  164.         public string FileName {
  165.             get { return _sheetInfo.fileName; }
  166.         }
  167.        
  168.  
  169.         public ProtocolRow(DataRow row, SheetWorker sheetInfo) {
  170.             _sheetInfo = sheetInfo;
  171.             Output = row[0].ToString();
  172.             ByteNumber = row[1].ToString();
  173.             Type = row[3].ToString();
  174.             CustomName = row[4].ToString();
  175.             ServerName = row[5].ToString();
  176.             if(row.ItemArray.Length < 7) return;
  177.             ClientName = row[6].ToString();            
  178.         }
  179.  
  180.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы