2016-09-26 6 views
0

Tous,En utilisant win32com et les cellules à MERGE unmerge

J'ai une table dans un document Word qui contient cellules fusionnées. Je voudrais annuler la fusion ces cellules en utilisant le package win32com. Un exemple de ceci est lorsque ROW 1 contient 5 cellules, et ROW 2 contient 6 cellules. Idéalement, je voudrais annuler la fusion de toutes les cellules fusionnées dans ROW 1 de telle sorte que les cellules non fusionnées s'alignent avec ROW 2 et que les données soient affichées dans la cellule la plus à gauche de la plage non fusionnée résultante.

Exemple:

(Fusionné)

+++++++++++++++++++++++++++++++++++++ 
|hi |bye |  |Hello  |none | 
+++++++++++++++++++++++++++++++++++++ 
|1 |21 |23 |good |bye |3 | 
+++++++++++++++++++++++++++++++++++++ 

(défusionnée)

+++++++++++++++++++++++++++++++++++++ 
|hi |bye |  |Hello|  |none | 
+++++++++++++++++++++++++++++++++++++ 
|1 |21 |23 |good |bye |3 | 
+++++++++++++++++++++++++++++++++++++ 

Dans le tableau avec fusionné cellules, il y a un total de cellules. Dans le tableau non fusionné, il y a cellules.

Toutes les idées sur la façon de procéder. La documentation pour le module win32com est assez clairsemée, et le peu qui semble exister est bloqué pendant que je suis au travail.

L'aide serait grandement appréciée.

+++ ------------------------------------------- ------------------------------- +++

Détails supplémentaires:

Je suis apportant mes données comme ceci:

#Opens an instance of MS Word in the background, then accesses the referenced 
#file. 

path = "string containing directory name" 

Word = win32.Dispatch("Word.Application") 
Word.Visible = False 
Word.Documents.Open(path) 

#Creates a com element containing access to the document contents of the file referenced above 
MT_doc = Word.ActiveDocument 

Je prends alors les tables sur le fichier en utilisant le code suivant:

#Determins the number of tables in the Word Document and outputs a table 
#element to "table" 
num_tables = MT_doc.Tables.Count 
table = MT_doc.Tables 

Là où je suis bloqué est que:

table(1).Rows(1).Cells.Count != table(1).Rows(2).Cells.Count 

Dans ce cas, la première ligne a 10 cellules tandis que la seconde ligne a 18 cellules. Sans pouvoir diviser ces cellules fusionnées, le reste de mon code ne peut pas s'exécuter.

Répondre

0

J'ai trouvé une solution à mon problème. Après beaucoup de recherches, il semblerait que les tables incorporées à l'intérieur de MS Word n'aient pas de propriété de "fusion" qui leur est associée. Cependant, ils ont une propriété "width" qui leur est associée. Obtenir ceci using win32com ressemble quelque chose comme ceci:

#See above for definition of "table" - it's just a win32com COM module 
#containing all the tables inside of an MS Word document. 
width = table(1).Rows(1).Cells(i).Width 

Cela renvoie un type (largeur) = float pour chaque cellule.Cette valeur peut être comparée à la valeur de largeur de n'importe quelle cellule au-dessus ou au-dessous selon les besoins. Si la valeur de largeur d'une cellule en question n'est pas égale à la largeur d'une cellule au-dessus ou au-dessous, vous savez qu'une cellule donnée est formatée de telle sorte qu'il existe un potentiel pour la table incorporée contenir une cellule comme mon original exemple de disposition de cellule. En itérant sur les cellules au-dessus ou au-dessous, il est possible d'ajouter les largeurs de ces cellules ensemble jusqu'à ce qu'elles soient égales ou approximativement égales les unes aux autres. Pour mon code, les cellules doivent être égales à une valeur entière l'une de l'autre. Ceci est accompli en utilisant une fonction round() pour éviter un scénario où une personne ouvre le document Word, modifie accidentellement la largeur d'une seule cellule, puis ne fixe que la largeur de la cellule à l'oeil [Cela m'est arrivé au début et c'était J'ai accidentellement mis toutes les largeurs de cellules dans mon fichier à width = 60. Lorsque j'ai corrigé la disposition de la table, je n'ai pas récupéré une seule cellule à l'endroit où elle appartenait].

La mise en œuvre du code discuté est plutôt longue et quelque peu spécifique à mon problème particulier. Cependant, le concept d'utilisation de largeurs de cellules PAS une propriété «fusionnée» de la cellule est largement applicable et devrait être une approche utile pour d'autres personnes ayant des problèmes similaires à prendre.

0

Vous pouvez le réaliser comme:

table.Rows[0].Cells[0].Merge(table.Rows[1].Cells[0])