When I save a document to text tables in the document are folded to a single column of headers and cell content rather than tabular format. Is there a way to maintain the tables in some resemblance of a table? Word 2007 seems to do the same however prior versions of Word maintained the table.
Hi
Thanks for your inquiry. This is known issue #4736.
Issue #4736 – Implement export of tables preserving table layout
As a workaround you can try using custom method for converting document to txt format. For example see the following code:
public void Example004()
{
Document doc = new Document(@"C:\Temp\in.doc");
string text = CustomToTxtConvertor.Convert(doc);
Stream file = new FileStream(@"C:\Temp\out.txt", FileMode.Create);
StreamWriter writer = new StreamWriter(file);
writer.Write(text);
writer.Close();
file.Close();
}
public class CustomToTxtConvertor
{
///
/// Method converts document to string
///
/// Input document
/// String that represents content of input document
public static string Convert(Document doc)
{
string output = string.Empty;
// Loop through all sections in the document
foreach (Section currentSection in doc.Sections)
{
// If section contains primary header we will convert it to txt
if (currentSection.HeadersFooters[HeaderFooterType.HeaderPrimary] != null)
{
CompositeNode primaryHeader = (CompositeNode)currentSection.HeadersFooters[HeaderFooterType.HeaderPrimary];
output += ConvertCompositeNode(primaryHeader);
}
// Now we should convert body content
output += ConvertCompositeNode((CompositeNode)currentSection.Body);
// If section contains primary footer we will convert it to txt
if (currentSection.HeadersFooters[HeaderFooterType.FooterPrimary] != null)
{
CompositeNode primaryFooter = (CompositeNode)currentSection.HeadersFooters[HeaderFooterType.FooterPrimary];
output += ConvertCompositeNode(primaryFooter);
}
// Insert few empty lines between sections
output += "\r\n\r\n\r\n\r\n";
}
return output;
}
///
/// Method converts composite node to text
///
/// CompositeNode like HeaderFooter or Body
/// String that represents content of CompositeNode
private static string ConvertCompositeNode(CompositeNode container)
{
string output = string.Empty;
// Loop through all child nodes of composite node
foreach (Node child in container.ChildNodes)
{
// Convert chield nodes to Text
switch (child.NodeType)
{
case NodeType.Paragraph:
output += child.ToTxt();
break;
case NodeType.Table:
output += ConvertTable((Table)child);
break;
default:
output += child.ToTxt();
break;
}
}
return output;
}
///
/// Method converts table to string
///
/// input table
/// String that represents content of input table
private static string ConvertTable(Table tab)
{
string output = string.Empty;
// Calculate max string length of each table column
ArrayList columnWidhs = new ArrayList();
int tableWidth = 0;
string horizontalBorder = string.Empty;
// Loop through all rows in table
foreach (Row row in tab.Rows)
{
// Loop througth all cells in current row
foreach (Cell cell in row.Cells)
{
int cellIndex = row.Cells.IndexOf(cell);
if (columnWidhs.Count > cellIndex)
{
if ((int)columnWidhs[cellIndex] < cell.ToTxt().Length)
{
columnWidhs[cellIndex] = cell.ToTxt().Length;
}
}
else
{
columnWidhs.Add(cell.ToTxt().Length);
}
}
}
// Calculate width of table
for (int index = 0; index < columnWidhs.Count; index++)
{
tableWidth += (int)columnWidhs[index];
}
tableWidth += columnWidhs.Count;
// Build horizontal border
for (int index = 0; index < tableWidth; index++)
{
horizontalBorder += "-";
}
horizontalBorder += "\r\n";
// Insert "Top Border"
output += horizontalBorder;
// Loop through all rows in table
foreach (Row row in tab.Rows)
{
string currentRow = "|";
// Loop througth all cells in current row
foreach (Cell cell in row.Cells)
{
int cellIndex = row.Cells.IndexOf(cell);
// Remove line breaks from cell text
string curentCell = cell.ToTxt().Replace("\r", " ").Replace("\n", " ");
// Insert white spaces to the end of cell text
while (curentCell.Length < (int)columnWidhs[cellIndex])
{
curentCell += " ";
}
// Insert "Vertical border"
currentRow += curentCell + "|";
}
output += currentRow + "\r\n";
// Insert "horizontal Border"
output += horizontalBorder;
}
return output;
}
}
Hope this helps.
Best regards.
Hi
Sorry, I missed that in the latest version of Aspose.Words there is a SaveOptions.TxtExportTableLayout option. So you can use the following code:
Document doc = new Document(@"C:\Temp\in.doc");
doc.SaveOptions.TxtExportTableLayout = true;
doc.Save(@"C:\Temp\out1.txt", SaveFormat.Text);
Best regards.