OK,
Jednym z trudniejszych pojęć uchwycić temat programowania Excel VSTO jest to, że nie odnoszą się do komórek jak tablica, Worksheet[0][0]
nie da Ci komórki A1 , spowoduje to błąd na tobie. Nawet gdy wpiszesz w A1, gdy Excel jest otwarty, faktycznie wprowadzasz dane do Zasięgu A1. Dlatego odnosisz się do komórek jako nazwanych zakresów. Oto przykład:
Excel.Worksheet sheet = workbook.Sheets["Sheet1"] as Excel.Worksheet;
Excel.Range range = sheet.get_Range("A1", Missing.Value)
Teraz można dosłownie wpisać:
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)
Jeśli chcesz zrobić coś takiego:
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
}
może istnieć lepszy sposób, ale to nie ma pracował dla mnie.
Powodem trzeba użyć Value2
i nie Value
dlatego, że nieruchomość Value
jest sparametryzowanego i C# nie obsługuje ich jeszcze.
Jeśli chodzi o kod oczyszczający, opublikuję, że kiedy jutro przyjadę do pracy, nie mam kodu ze mną, ale jest to bardzo podstawowe. Po prostu zamykasz i zwalniasz obiekty w odwrotnej kolejności, w jakiej je stworzyłeś. Nie można użyć bloku Using()
, ponieważ plik Excel.Application lub Excel.Workbook nie implementuje IDisposable
, a jeśli nie zostanie wyczyszczony, pozostaną wiszące obiekty Excel w pamięci.
Uwaga:
- Jeśli nie ustawić właściwość
Visibility
Excel nie wyświetla, które mogą być niepokojące dla użytkowników, ale jeśli chcesz po prostu zgrać dane na zewnątrz, to jest prawdopodobnie dobry wystarczy
- Możesz też OleDb, to też zadziała.
Mam nadzieję, że zaczniesz, daj mi znać, jeśli potrzebujesz dalszych wyjaśnień. Będę pisać kompletny
tutaj jest kompletny próbki:
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);
}
}
}
}
wyślę funkcje z ExcelTools jutro, nie mam tego kodu ze mną albo.
Edytuj: Zgodnie z obietnicą, oto funkcje z narzędzi ExcelTools, których możesz potrzebować.
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;
}
}
Mówiąc szczerze, te rzeczy są znacznie łatwiejsze, jeśli używasz VB.NET. Jest w języku C#, ponieważ go nie napisałem. VB.NET robi dobrze parametry opcji, C# nie, stąd Type.Missing. Po wpisaniu Wpisz.Tracę dwa razy z rzędu, uciekasz krzycząc z pokoju!
Jak Ci pytanie, można spróbować następujących czynności:
http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.find(VS.80).aspx
będę pisać przykład, kiedy wrócę z mojego spotkania ... Zdrówko
EDIT: Oto przykład
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
Oto kolejny przykład zainspirowane tym site:
range = sheet.Cells.Find("Value to find", Type.Missing, Type.Missing,Excel.XlLookAt.xlWhole,Excel.XlSearchOrder.xlByColumns,Excel.XlSearchDirection.xlNext,false, false, Type.Missing);
Pomaga zrozumieć parametry.
P.S. Jestem jednym z tych dziwnych ludzi, którzy lubią uczyć się automatyzacji COM. Cały ten kod był na parze z narzędzia, które napisałem do pracy, co wymagało ode mnie przetworzenia ponad 1000 arkuszy kalkulacyjnych z laboratorium w każdy poniedziałek.
Nowi użytkownicy pochodzące rozwiązania może chcieć, aby zobaczyć ten wątek [] (https://stackoverflow.com/questions/33302235/how-to-read-from-xlsx-excel). –