将表转换为带空格的文本

时间:2011-06-03 13:47:32

标签: text ms-word spaces

我在几年的编程中遇到过这几次,所以我决定做一些研究,看看是否可能。我经常在代码中创建数据结构,这些数据结构以类似于表格的方式初始化,包含行和列,我本来希望有这种表到文本的功能以实现代码可读性。如何在word,excel或其他程序中创建表,并将表格的单元格输出为带有空格(而不是制表符)的文本? Word可以使用制表符来实现,而excel可以使用未对齐的空格来完成。有没有可以实现自动化的程序?

2 个答案:

答案 0 :(得分:0)

从excel导出时,您是否尝试过使用等宽字体,例如courier?大多数字体会根据每个字符的特定宽度,高度和字距调整间距,但是等宽字体将允许您使用空格进行对齐。

至于自动将标签转换为空格,如果没有1000个方法,应用程序,命令,那么必须有100个。

答案 1 :(得分:0)

我花了一两个小时来研究这个。我尝试了excel和word,他们都非常接近于确切的解决方案,这让我发疯了。我在线尝试了其他程序,但没有运气。这是我的解决方案,Microsoft的Word的Table-To-Text功能和自定义C#程序,它将Word-tabified文本转换为带有空格而不是制表符的列对齐文本。

1)将您的列和行放在MS Word表中 2)使用制表符将表格转换为文本(查找如何执行此操作)
3)将转换后的表保存为纯文本文件
4)使用我的程序打开并转换文件
5)将输出文件中的文本复制到代码中

下面是我写的C#Windows窗体应用程序。我为缺乏优化而道歉。我在工作,并希望尽快完成:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            OpenFileDialog of = new OpenFileDialog();
            of.Title = "Select Tabbed Text File To Convert";

            if (of.ShowDialog() != DialogResult.OK)
                return;

            StreamReader s = new StreamReader(of.OpenFile());

            List<string> lines = new List<string>();

            string line;

            // Get each line into an array of lines.
            while ((line = s .ReadLine()) != null)
                lines.Add(line);

            int numTabs = 0;

            // count the number of tabs in each line, assume good input, i.e. 
            // all lines have equal number of tabs.
            foreach (char c in lines[0])
                if (c == '\t')
                    numTabs++;

            for (int i = 0; i < numTabs; i++)
            {
                int tabIndex = 0;

                // Loop through each line and find the "deepest" location of
                // the first tab.
                foreach (string l in lines)
                {
                    int index = 0;

                    foreach (char c in l)
                    {
                        if (c == '\t')
                        {
                            if (index > tabIndex)
                                tabIndex = index;

                            break;
                        }

                        index++;
                    }
                }

                // We know where the deepest tab is, now we go through and 
                // add enough spaces to take the first tab of each line out
                // to the deepest.
                //foreach (string l in lines)
                for (int l = 0; l < lines.Count; l++)
                {
                    int index = 0;

                    foreach (char c in lines[l])
                    {
                        if (c == '\t')
                        {
                            int numSpaces = (tabIndex - index) + 1;

                            string spaces = "";

                            for (int j = 0; j < numSpaces; j++)
                                spaces = spaces + " ";

                            lines[l] = lines[l].Remove(index, 1);
                            lines[l] = lines[l].Insert(index, spaces);

                            break;
                        }

                        index++;
                    }
                }
            }

            FileInfo f = new FileInfo(of.FileName);

            string outputFile = f.FullName.Insert(f.FullName.IndexOf(f.Extension), " (Aligned)");

            StreamWriter w = new StreamWriter(outputFile);

            foreach (string l in lines)
                w.Write(l + "\r\n");

            w.Close();
            s.Close();

            MessageBox.Show("Created the file: " + outputFile);
        }
    }
}