OK,
Một trong những khái niệm khó khăn hơn để nắm bắt về lập trình Excel VSTO là bạn không đề cập đến các tế bào giống như một mảng, Worksheet[0][0]
sẽ không cung cấp cho bạn cell A1 , nó sẽ gây lỗi cho bạn. Ngay cả khi bạn gõ vào A1 khi Excel đang mở, bạn đang thực sự nhập dữ liệu vào Phạm vi A1. Do đó, bạn tham khảo ô như Phạm vi có tên. Dưới đây là một ví dụ:
Excel.Worksheet sheet = workbook.Sheets["Sheet1"] as Excel.Worksheet;
Excel.Range range = sheet.get_Range("A1", Missing.Value)
Bạn bây giờ có thể theo nghĩa đen gõ:
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)
Nếu bạn muốn làm một cái gì đó như thế này:
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
}
Có thể có một cách tốt hơn, nhưng điều này có đã làm cho tôi.
Lý do bạn cần sử dụng Value2
và không Value
là do thuộc tính Value
là một tham số và C# chưa hỗ trợ chúng.
Đối với mã dọn dẹp, tôi sẽ đăng bài đó khi tôi đi làm vào ngày mai, tôi không có mã với tôi, nhưng nó rất sôi nổi. Bạn chỉ cần đóng và giải phóng các đối tượng theo thứ tự ngược lại bạn đã tạo chúng. Bạn không thể sử dụng khối Using()
vì Excel.Application hoặc Excel.Workbook không triển khai IDisposable
và nếu bạn không dọn dẹp, bạn sẽ bị bỏ lại với một đối tượng Excel treo trong bộ nhớ.
Lưu ý:
- Nếu bạn không thiết lập các tài sản
Visibility
Excel không hiển thị, có thể được ngạc cho người dùng của bạn, nhưng nếu bạn muốn chỉ cần trích xuất dữ liệu ra, đó có lẽ là tốt đủ
- Bạn có thể OleDb, điều đó cũng sẽ hoạt động.
Tôi hy vọng bạn sẽ bắt đầu, hãy cho tôi biết nếu bạn cần làm rõ thêm. Tôi sẽ đăng một hoàn
đây là một ví dụ hoàn chỉnh:
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);
}
}
}
}
tôi sẽ đăng các chức năng từ ExcelTools ngày mai, tôi không có mã đó với tôi cả.
Chỉnh sửa: Như đã hứa, dưới đây là các hàm từ ExcelTools bạn có thể cần.
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;
}
}
Nói thẳng ra, công cụ này dễ dàng hơn nhiều nếu bạn sử dụng VB.NET. Đó là trong C# bởi vì tôi đã không viết nó. VB.NET có các tham số tùy chọn tốt, C# không, do đó Type.Missing. Khi bạn đã nhập Loại.Bỏ lỡ hai lần liên tiếp, bạn chạy la hét từ phòng!
Đối với bạn thắc mắc, bạn có thể thử như sau:
http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.find(VS.80).aspx
tôi sẽ đăng một ví dụ khi tôi nhận được trở lại từ cuộc họp của tôi ... chúc mừng
Edit: Đây là một ví dụ
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
Dưới đây là một ví dụ khác lấy cảm hứng từ này 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);
Nó giúp hiểu các tham số.
P.S. Tôi là một trong những người kỳ lạ thích học tự động hóa COM. Tất cả mã này được lấy từ một công cụ tôi đã viết cho công việc yêu cầu tôi xử lý hơn 1000 bảng tính từ phòng thí nghiệm vào mỗi thứ Hai.
Người dùng mới sắp tới giải pháp có thể muốn xem [thread] này (https://stackoverflow.com/questions/33302235/how-to-read-from-xlsx-excel). –