2011-11-15 22 views
6

Este es probablemente un poco estúpido, pero realmente lo necesito. Tengo un documento con 5 tablas, cada tabla tiene un encabezado. el encabezado es un texto regular sin un estilo especial, nada. Necesito extraer datos de esas tablas + encabezado más. En la actualidad, el uso de MS interoperabilidad fui capaz de recorrer cada célula de cada tabla que usa algo como esto:Obtener el texto sobre la tabla MS Word

app.Tables[1].Cell(2, 2).Range.Text; 

Pero ahora estoy luchando en tratar de encontrar la manera de obtener el texto justo encima de la mesa. Aquí hay una captura de pantalla: enter image description here

Para la primera tabla que necesito para obtener "NECESITO ESTE TEXTO" y para la tabla secnd que necesito para obtener: "Y éste también, por favor"

Así que, básicamente, necesito última párrafo antes de cada cuadro. ¿Alguna sugerencia sobre cómo hacer esto?

Respuesta

3

Puede probar algo parecido a esto. Comparo los párrafos con la primera celda de la tabla, y cuando hay una coincidencia, toma el párrafo anterior como el encabezado de la tabla. Por supuesto, esto sólo funciona si la primera celda de la tabla contiene un párrafo único que no se encuentra en otro lugar del documento:

var tIndex = 1; 
var tCount = oDoc.Tables.Count; 
var tblData = oDoc.Tables[tIndex].Cell(1, 1).Range.Text; 
var pCount = oDoc.Paragraphs.Count; 
var prevPara = ""; 
for (var i = 1; i <= pCount; i++) { 
    var para = oDoc.Paragraphs[i]; 
    var paraData = para.Range.Text; 

    if (paraData == tblData) { 
     // this paragraph is at the beginning of the table, so grab previous paragraph 
     Console.WriteLine("Header: " + prevPara); 
     tIndex++; 
     if (tIndex <= tCount) 
      tblData = oDoc.Tables[tIndex].Cell(1, 1).Range.Text; 
     else 
      break; 
    } 
    prevPara = paraData; 
} 

Ejemplo de salida:

Header: I NEED THIS TEXT 

Header: AND THIS ONE also please 
+0

¡Muchas gracias por su ayuda! Tu solución me dio una idea sobre cómo implementar esto. Después de pasar un tiempo, descubrí una manera más fácil de hacerlo. Voy a publicar esto como una respuesta. – user194076

9

Mellamokb en su respuesta dio una pista y un buen ejemplo de cómo buscar en párrafos. Mientras implementaba su solución, encontré la función "Anterior" que hace exactamente lo que necesitamos. Aquí se explica cómo usarlo:

wd.Tables[1].Cell(1, 1).Range.Previous(WdUnits.wdParagraph, 2).Text; 

Anterior acepta dos parámetros. Primero, la unidad que desea encontrar en esta lista: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.wdunits.aspx y el segundo parámetro es la cantidad de unidades que desea contar. En mi caso 2 funcionó. Parecía que debería ser porque está justo antes de la mesa, pero con uno, obtuve un extraño carácter especial: que se parece al indicador femenino.

+0

Pensé que buscar en Google "Cómo obtener texto sobre una tabla en la palabra" sería completamente inútil, pero estaba desesperado y lo intenté. Esto me llevó a una solución. ¡Gracias! I C# con netoffice, desea utilizar el método previousSibling() en la tabla. – user1815201

+0

¡Gran respuesta, muchas gracias! –

+0

¡Guau! truco realmente inteligente, funciona perfectamente –

Cuestiones relacionadas