Temat: Potrzebna pomoc open office 4 w c#
Rozumiem, co chcesz uzyskać :) Sam tworzyłem podobne rozwiązanie pod pewien znany system do obsługi szpitali. Faktycznie OO to trochę komplikuje, jednak spokojnie możesz uzyskać listę pól w takim porządku, jak występują w dokumencie. Co ciekawe, iterator zawsze startuje od pierwszego pola (sprawdzałem wielokrotnie), dopiero potem czasem się "gubi". Musisz utworzyć widok dokumentu, po którym będziesz "skakał" od pola do pola i zapisywał je oraz jego położenie (X, Y) do tymczasowej kolekcji. Później musisz posortować tę kolekcję najpierw po Y (1 wiersz, 2 wiersz etc.) a potem po X (od lewej do prawej). I masz kolekcję pól tak, jak wystepują w dokumencie. Oczywiście pod warunkiem, że nie masz tam jakichś ramek z pozycjonowaniem absolutnym, tabel z "merdżowanymi" wierszami/kolumnami i faktycznie geometryczny układ pól odzwierciedla ich logiczną kolejność.
PS: zakładam, że masz już zainicjowany xComponent
usingi (mogą być nadmiarowe, pousuwaj zbędne):
using unoidl.com.sun.star.lang;
using unoidl.com.sun.star.uno;
using unoidl.com.sun.star.bridge;
using unoidl.com.sun.star.frame;
using unoidl.com.sun.star.text;
using unoidl.com.sun.star.container;
using unoidl.com.sun.star.util;
using unoidl.com.sun.star.view;
using unoidl.com.sun.star.beans;
using uno.util;
using uno;
public List<XTextField> GetOrderedDocumentFields()
{
XTextDocument document = (XTextDocument) this.xComponent;
XTextViewCursorSupplier xViewCursorSupplier = (XTextViewCursorSupplier) document.getCurrentController();
XTextViewCursor xTextViewCursor = xViewCursorSupplier.getViewCursor();
XEnumerationAccess documentFields = ((XTextFieldsSupplier) this.xComponent).getTextFields();
XEnumeration docFields = documentFields.createEnumeration();
List<FieldWithCoords> fieldsWithCoordinates = new List<FieldWithCoords>();
while (docFields.hasMoreElements())
{
XTextField nextField = docFields.nextElement().Value as XTextField;
xTextViewCursor.gotoRange(nextField.getAnchor(), false);
fieldsWithCoordinates.Add(new FieldWithCoords(nextField,
xTextViewCursor.getPosition().X,
xTextViewCursor.getPosition().Y));
}
return fieldsWithCoordinates.OrderBy(m => m.Y).ThenBy(m => m.X).ToList().Select(m=>m.Field).ToList();
}
private class FieldWithCoords
{
public XTextField Field { get; private set;}
public int X { get; private set; }
public int Y { get; private set; }
public FieldWithCoords(XTextField field, int x, int y)
{
this.Field = field;
this.X = x;
this.Y = y;
}
}
PS: jeśli zamierzasz coś potem robić z tym dokumentem, np. drukować, musisz "zrestartować" widok, tj. ustawić kursor na początku dokumentu:
xTextViewCursor.gotoStart(false);
Ten post został edytowany przez Autora dnia 04.11.13 o godzinie 20:04