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

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

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

ВОПРОС Как извлечь данные из Excel не открывая файл? СЦЕНАРИЙ 1. В поле "ID" вводим значение "ID" (ID - записи восьмизначное число) 2. В поле "СОДЕРЖАНИЕ ЗАПИСИ" появляется запись из базы данных, которое соответсnвует ID. Прилагаю болванку для кода
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace ExcelDb
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        private void groupBox2_Enter(object sender, EventArgs e)
        {
 
        }
 
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
 
        }
    }
}
ПРИЛОЖЕНИЕ. 1. Проект

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

textual
Листинг программы
class WorkBookWorker {
        readonly List<SheetWorker> _sheetInfos = new List<SheetWorker>();
        readonly OleDbConnection _connection;
        public WorkBookWorker(string filePath) {
 
            _connection = new OleDbConnection(
                "provider=Microsoft.Jet.OLEDB.4.0;" +
                "data source=" + filePath +
                ";Extended Properties=Excel 8.0;"
                );
            _connection.Open();
       
            var adapter = new OleDbDataAdapter(
                    "select * from [Clients$]", _connection);
            var table = new DataTable();
            adapter.Fill(table);
 
            string fileName = new FileInfo(filePath).Name;
            var sheets = table.Rows.Cast<DataRow>().Select(row => row.Field<string>(1)).Distinct();
            foreach (var sheet in sheets) {
                if (sheet == null) continue;
                SheetWorker sheetInfo = new SheetWorker(_connection, sheet, fileName);
                if(sheetInfo.isCorrect) _sheetInfos.Add(sheetInfo); 
            }
            }
 
        public List<ProtocolRow> FindRows(Func<ProtocolRow, bool> rule) {
            List<ProtocolRow> rows = new List<ProtocolRow>();
            foreach (var sheet in _sheetInfos) {
                sheet.FindRows(rule, ref rows);
            }
            return rows;
        }
 
 
        public List<ProtocolRow> FindRows(Func<string, bool> rule)
        {
            List<ProtocolRow> rows = new List<ProtocolRow>();
            foreach (var sheet in _sheetInfos)
            {
                sheet.FindRows(rule, ref rows);
            }
            return rows;
               
        }
 
 
        public void ReplaceRows(Func<string, bool> rule, Func<string, string> convertor) {
            foreach (var sheet in _sheetInfos) {
                sheet.ReplaceRows(rule, convertor, _connection);
            }
            _connection.Close();
        }
    }
class SheetWorker {
        readonly DataTable _table;
        public readonly bool isCorrect = true;
        public readonly string fileName;
        public readonly string sheetName;
 
 
        public SheetWorker(OleDbConnection connection, string sheetName, string fileName) {
            this.fileName = fileName;
            this.sheetName = sheetName;
            var adapter =
                new OleDbDataAdapter(
                    "select * from [" + sheetName + "$]", connection);
            _table = new DataTable();
            try {
                adapter.Fill(_table);
            } catch (Exception) {
                isCorrect = false;
            }
 
        }
 
        public void FindRows(Func<ProtocolRow, bool> rule, ref List<ProtocolRow> rows) {
            rows.AddRange(
                _table.Rows.Cast<DataRow>().Select(row => new ProtocolRow(row, this)).Where(rule));
        }
 
        public void FindRows(Func<string, bool> rule, ref List<ProtocolRow> rows) {
            rows.AddRange(
                _table.Rows.Cast<DataRow>().
                    Where(row => (row.ItemArray.Length > 5 && rule(row[5].ToString())) || (row.ItemArray.Length > 6 && rule(row[6].ToString()))).
                    Select(row => new ProtocolRow(row, this)).ToArray());
        }
 
 
        public void ReplaceRows(Func<string, bool> selectionRule, Func<string, string> stringConvertor, OleDbConnection connection) {
            Func<DataRow, bool> rule = row => row.ItemArray.Length > 5 && selectionRule(row[5].ToString());
            var correctRows = _table.Rows.Cast<DataRow>().Where(rule).Distinct().ToArray();
 
            if (correctRows.Any()) {
                StringBuilder builder = new StringBuilder("Update [");
                builder.Append(sheetName);
                builder.Append("$] Set ");
                builder.Append(_table.Columns[5].ColumnName);
                builder.Append(" = '");
 
                foreach (var correctRow in correctRows) {
                    StringBuilder commandStr = new StringBuilder(builder.ToString());
 
                    string oldRowName = correctRow[5].ToString();
                    string rowName = stringConvertor(oldRowName);
 
                    commandStr.Append(rowName);
                    commandStr.Append("' Where ");
                    commandStr.Append(_table.Columns[5].ColumnName);
                    commandStr.Append(" = '");
                    commandStr.Append(oldRowName);
                    commandStr.Append("'");
 
                    OleDbCommand command = new OleDbCommand(commandStr.ToString(), connection);
                    command.ExecuteNonQuery();
                }
            }
 
            rule = row => row.ItemArray.Length > 6 && selectionRule(row[6].ToString());
            correctRows = _table.Rows.Cast<DataRow>().Where(rule).Distinct().ToArray();
 
            if (correctRows.Any()) {
                StringBuilder builder = new StringBuilder("Update [");
                builder.Append(sheetName);
                builder.Append("$] Set ");
                builder.Append(_table.Columns[6].ColumnName);
                builder.Append(" = '");
 
                foreach (var correctRow in correctRows) {
                    StringBuilder commandStr = new StringBuilder(builder.ToString());
 
                    string oldRowName = correctRow[6].ToString();
                    string rowName = stringConvertor(oldRowName);
 
                    commandStr.Append(rowName);
                    commandStr.Append("' Where ");
                    commandStr.Append(_table.Columns[6].ColumnName);
                    commandStr.Append(" = '");
                    commandStr.Append(oldRowName);
                    commandStr.Append("'");
 
                    OleDbCommand command = new OleDbCommand(commandStr.ToString(), connection);
                    command.ExecuteNonQuery();
                }
            }
        }
    }
class ProtocolRow {
        
        public string Output { get; set; }
        public string ByteNumber { get; set; }
        public string Type { get; set; }
 
        public string CustomName { get; set; }
        public string ServerName { get; set; }
        public string ClientName { get; set; }
 
        SheetWorker _sheetInfo;
 
        public string SheetName {
            get { return _sheetInfo.sheetName; }
        }
 
        public string FileName {
            get { return _sheetInfo.fileName; }
        }
        
 
        public ProtocolRow(DataRow row, SheetWorker sheetInfo) {
            _sheetInfo = sheetInfo;
            Output = row[0].ToString();
            ByteNumber = row[1].ToString();
            Type = row[3].ToString();
            CustomName = row[4].ToString();
            ServerName = row[5].ToString();
            if(row.ItemArray.Length < 7) return;
            ClientName = row[6].ToString();            
        }
 
    }

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


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

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

15   голосов , оценка 4.067 из 5
Похожие ответы