Wie man eine Excel-Datei mit C# lesen? Ich öffne eine Excel-Datei zum Lesen und kopieren Sie es in die Zwischenablage, um E-Mail-Format zu suchen, aber ich weiß nicht, wie man es tun.
FileInfo finfo;
Excel.ApplicationClass ExcelObj = new Excel.ApplicationClass();
ExcelObj.Visible = false;
Excel.Workbook theWorkbook;
Excel.Worksheet worksheet;
if (listView1.Items.Count > 0)
{
foreach (ListViewItem s in listView1.Items)
{
finfo = new FileInfo(s.Text);
if (finfo.Extension == ".xls" || finfo.Extension == ".xlsx" || finfo.Extension == ".xlt" || finfo.Extension == ".xlsm" || finfo.Extension == ".csv")
{
theWorkbook = ExcelObj.Workbooks.Open(s.Text, 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, false, false);
for (int count = 1; count <= theWorkbook.Sheets.Count; count++)
{
worksheet = (Excel.Worksheet)theWorkbook.Worksheets.get_Item(count);
worksheet.Activate();
worksheet.Visible = false;
worksheet.UsedRange.Cells.Select();
}
}
}
}
GUT,
Eines der schwierigeren Konzepte bei der Excel-VSTO-Programmierung ist, dass man sich nicht auf Zellen wie ein Array beziehen kann. Mit "Arbeitsblatt[0][0]" erhalten Sie nicht die Zelle A1, sondern es wird ein Fehler auftreten. Selbst wenn Sie bei geöffnetem Excel Daten in A1 eingeben, geben Sie tatsächlich Daten in den Bereich A1 ein. Daher bezeichnen Sie Zellen als benannte Bereiche. Hier's ein Beispiel:
Excel.Worksheet sheet = workbook.Sheets["Sheet1"] as Excel.Worksheet;
Excel.Range range = sheet.get_Range("A1", Missing.Value)
Sie können nun buchstäblich tippen:
range.Text // this will give you the text the user sees
range.Value2 // this will give you the actual value stored by Excel (without rounding)
Wenn Sie etwas Ähnliches tun wollen:
Excel.Range range = sheet.get_Range("A1:A5", Missing.Value)
if (range1 != null)
foreach (Excel.Range r in range1)
{
string user = r.Text
string value = r.Value2
}
Vielleicht gibt es einen besseren Weg, aber das hat bei mir funktioniert.
Der Grund, warum Sie Value2
und nicht Value
verwenden müssen, ist, dass die Eigenschaft Value
parametrisiert ist und C# diese noch nicht unterstützt.
Was den Bereinigungscode angeht, so werde ich diesen posten, wenn ich morgen zur Arbeit komme, ich habe den Code nicht bei mir, aber er ist sehr einfach gehalten. Die Objekte werden einfach in der umgekehrten Reihenfolge geschlossen und freigegeben, in der sie erstellt wurden. Sie können keinen Using()
-Block verwenden, weil Excel.Application oder Excel.Workbook IDisposable
nicht implementieren, und wenn Sie nicht aufräumen, werden Sie mit einem hängenden Excel-Objekt im Speicher zurückgelassen.
Anmerkung:
Visibility
nicht setzen, zeigt Excel die Daten nicht an, was für Ihre Benutzer verwirrend sein kann, aber wenn Sie die Daten einfach nur herausreißen wollen, ist das wahrscheinlich gut genugIch hoffe, das hilft Ihnen weiter, lassen Sie es mich wissen, wenn Sie weitere Erklärungen benötigen. Ich werde eine vollständige
hier ist ein vollständiges Beispiel:
using System;
using System.IO;
using System.Reflection;
using NUnit.Framework;
using ExcelTools = Ms.Office;
using Excel = Microsoft.Office.Interop.Excel;
namespace Tests
{
[TestFixture]
public class ExcelSingle
{
[Test]
public void ProcessWorkbook()
{
string file = @"C:\Users\Chris\Desktop\TestSheet.xls";
Console.WriteLine(file);
Excel.Application excel = null;
Excel.Workbook wkb = null;
try
{
excel = new Excel.Application();
wkb = ExcelTools.OfficeUtil.OpenBook(excel, file);
Excel.Worksheet sheet = wkb.Sheets["Data"] as Excel.Worksheet;
Excel.Range range = null;
if (sheet != null)
range = sheet.get_Range("A1", Missing.Value);
string A1 = String.Empty;
if( range != null )
A1 = range.Text.ToString();
Console.WriteLine("A1 value: {0}", A1);
}
catch(Exception ex)
{
//if you need to handle stuff
Console.WriteLine(ex.Message);
}
finally
{
if (wkb != null)
ExcelTools.OfficeUtil.ReleaseRCM(wkb);
if (excel != null)
ExcelTools.OfficeUtil.ReleaseRCM(excel);
}
}
}
}
Ich werde die Funktionen von ExcelTools morgen posten, ich habe den Code auch nicht dabei.
Edit: Wie versprochen, hier sind die Funktionen aus ExcelTools, die Sie brauchen könnten.
public static Excel.Workbook OpenBook(Excel.Application excelInstance, string fileName, bool readOnly, bool editable,
bool updateLinks) {
Excel.Workbook book = excelInstance.Workbooks.Open(
fileName, updateLinks, readOnly,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, editable, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
return book;
}
public static void ReleaseRCM(object o) {
try {
System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
} catch {
} finally {
o = null;
}
}
Um ehrlich zu sein, ist dieses Zeug viel einfacher, wenn Sie VB.NET verwenden. Es ist in C#, weil ich es nicht geschrieben habe. VB.NET kann gut mit Optionsparametern umgehen, C# nicht, daher die Type.Missing. Sobald Sie Type.Missing zweimal hintereinander getippt haben, rennen Sie schreiend aus dem Raum!
Wie für Ihre Frage, können Sie versuchen, folgende:
http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.find(VS.80).aspx
Ich werde ein Beispiel posten, wenn ich von meinem Meeting zurückkomme... Prost
Edit: Hier ist ein Beispiel
range = sheet.Cells.Find("Value to Find",
Type.Missing,
Type.Missing,
Type.Missing,
Type.Missing,
Excel.XlSearchDirection.xlNext,
Type.Missing,
Type.Missing, Type.Missing);
range.Text; //give you the value found
Hier ist ein weiteres Beispiel, das von dieser Website inspiriert wurde:
range = sheet.Cells.Find("Value to find", Type.Missing, Type.Missing,Excel.XlLookAt.xlWhole,Excel.XlSearchOrder.xlByColumns,Excel.XlSearchDirection.xlNext,false, false, Type.Missing);
Es hilft, die Parameter zu verstehen.
P.S. Ich bin einer dieser seltsamen Menschen, die gerne COM-Automatisierung lernen. All dieser Code stammt aus einem Tool, das ich für die Arbeit geschrieben habe und mit dem ich jeden Montag mehr als 1000 Tabellenkalkulationen aus dem Labor verarbeiten musste.
Warum erstellen Sie keine OleDbConnection? Im Internet gibt es eine Menge an verfügbaren Ressourcen. Hier ist ein Beispiel
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+filename+";Extended Properties=Excel 8.0");
con.Open();
try
{
//Create Dataset and fill with imformation from the Excel Spreadsheet for easier reference
DataSet myDataSet = new DataSet();
OleDbDataAdapter myCommand = new OleDbDataAdapter(" SELECT * FROM ["+listname+"$]" , con);
myCommand.Fill(myDataSet);
con.Close();
richTextBox1.AppendText("\nDataSet Filled");
//Travers through each row in the dataset
foreach (DataRow myDataRow in myDataSet.Tables[0].Rows)
{
//Stores info in Datarow into an array
Object[] cells = myDataRow.ItemArray;
//Traverse through each array and put into object cellContent as type Object
//Using Object as for some reason the Dataset reads some blank value which
//causes a hissy fit when trying to read. By using object I can convert to
//String at a later point.
foreach (object cellContent in cells)
{
//Convert object cellContect into String to read whilst replacing Line Breaks with a defined character
string cellText = cellContent.ToString();
cellText = cellText.Replace("\n", "|");
//Read the string and put into Array of characters chars
richTextBox1.AppendText("\n"+cellText);
}
}
//Thread.Sleep(15000);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
//Thread.Sleep(15000);
}
finally
{
con.Close();
}
Zunächst einmal ist es wichtig zu wissen, was Sie mit "eine Excel-Datei zum Lesen öffnen und in die Zwischenablage kopieren..." meinen;
Das ist sehr wichtig, denn es gibt viele Möglichkeiten, dies zu tun, je nachdem, was Sie vorhaben. Lassen Sie mich das erklären:
Wenn Sie eine Reihe von Daten lesen und in die Zwischenablage kopieren möchten und das Datenformat kennen (z. B. Spaltennamen), schlage ich vor, dass Sie eine OleDbConnection verwenden, um die Datei zu öffnen. Auf diese Weise können Sie den Inhalt der xls-Datei als Datenbanktabelle behandeln, so dass Sie die Daten mit SQL-Anweisungen lesen und die Daten wie gewünscht behandeln können.
Wenn Sie die Daten mit dem Excel-Objektmodell bearbeiten möchten, öffnen Sie die Datei so, wie Sie es begonnen haben.
Manchmal ist es möglich, eine xls-Datei als eine Art csv-Datei zu behandeln. Es gibt Werkzeuge wie File Helpers, die es Ihnen erlauben, eine xls-Datei auf einfache Weise zu behandeln und zu öffnen, indem Sie eine Struktur auf ein beliebiges Objekt abbilden.
Ein weiterer wichtiger Punkt ist, in welcher Excel-Version die Datei vorliegt.
Ich habe, wie ich leider sagen muss, sehr viel Erfahrung mit Office-Automatisierung, auch wenn ich mich auf Konzepte wie Anwendungsautomatisierung, Datenmanagement und Plugins beschränke, und ich empfehle im Allgemeinen nur als letzten Ausweg, Excel-Automatisierung oder Office-Automatisierung zu verwenden, um Daten zu lesen; nur wenn es keine besseren Möglichkeiten gibt, diese Aufgabe zu erfüllen.
Die Arbeit mit der Automatisierung könnte schwer in der Leistung, in Bezug auf die Ressourcenkosten, könnte in anderen Fragen im Zusammenhang mit z. B. Sicherheit und mehr, und schließlich, aber nicht zuletzt, die Arbeit mit COM interop it's nicht so "free". Also mein Vorschlag ist, denken und analysieren die Situation innerhalb Ihrer Bedürfnisse und nehmen Sie dann den besseren Weg.