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