OK,
L'un des concepts les plus difficiles à comprendre en matière de programmation Excel VSTO est qu'il ne faut pas se référer aux cellules comme à un tableau, Worksheet[0][0]
ne vous donnera pas la cellule A1, il se trompera sur vous. Même lorsque vous tapez dans A1 lorsque Excel est ouvert, vous saisissez en fait des données dans la plage A1. C'est pourquoi les cellules sont appelées "plages nommées". Voici un exemple :
Excel.Worksheet sheet = workbook.Sheets["Sheet1"] as Excel.Worksheet;
Excel.Range range = sheet.get_Range("A1", Missing.Value)
Vous pouvez maintenant taper littéralement :
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)
Si vous voulez faire quelque chose comme ça :
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
}
Il existe peut-être une meilleure méthode, mais celle-ci a fonctionné pour moi.
La raison pour laquelle vous devez utiliser Value2
et non Value
c'est parce que le Value
est une propriété paramétrée et C# ne les prend pas encore en charge.
Pour ce qui est du code de nettoyage, je le posterai demain en arrivant au travail, je n'ai pas le code avec moi, mais c'est très banal. Il suffit de fermer et de libérer les objets dans l'ordre inverse de leur création. Vous ne pouvez pas utiliser un Using()
parce que l'application Excel ou le classeur Excel n'implémente pas l'outil de gestion des données. IDisposable
et si vous ne faites pas le ménage, vous vous retrouverez avec des objets Excel en mémoire.
Note :
- Si vous ne définissez pas l'option
Visibility
La propriété Excel ne s'affiche pas, ce qui peut être déconcertant pour vos utilisateurs, mais si vous voulez simplement extraire les données, c'est probablement suffisant.
- Vous pouvez utiliser OleDb, cela fonctionnera aussi.
J'espère que cela vous aidera à démarrer, faites-moi savoir si vous avez besoin d'autres précisions. Je vais poster une
voici un échantillon complet :
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);
}
}
}
}
Je posterai les fonctions d'ExcelTools demain, je n'ai pas ce code avec moi non plus.
Modifier : Comme promis, voici les fonctions d'ExcelTools dont vous pourriez avoir besoin.
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;
}
}
Pour être franc, ce truc est beaucoup plus facile si vous utilisez VB.NET. C'est en C# parce que je ne l'ai pas écrit. VB.NET fait bien les paramètres d'option, C# ne le fait pas, d'où le Type.Missing. Une fois que vous avez tapé Type.Missing deux fois de suite, vous vous enfuyez de la pièce en hurlant !
Pour répondre à votre question, vous pouvez essayer de suivre :
http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.find(VS.80).aspx
Je posterai un exemple lorsque je rentrerai de ma réunion... Merci.
Edit : Voici un exemple
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
Voici un autre exemple inspiré de ce qui précède 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);
Il est utile de comprendre les paramètres.
P.S. Je suis une de ces personnes bizarres qui aiment apprendre l'automatisation de COM. Tout ce code provient d'un outil que j'ai écrit pour mon travail et qui me demandait de traiter plus de 1000 feuilles de calcul du laboratoire chaque lundi.
0 votes
Les nouveaux utilisateurs à la recherche d'une solution pourraient vouloir voir cela. filetage .