//这个list是把表里数据处理了,写的不太好,写成了
//"WL(nm)样品1\t样品2\t样品3"
//"400\t0\t0.003\t0.001"
//"399\t0.001\t-0.002\t0.001"
//这种的list,也就是每一项后面加一个制表符\t,以后有空再写成直接用datagridview的
List<string> strs = Control.ToTxt();
if(strs == null || strs.Count == 0)
{
return;
}
CoverControlEnvironment initcong = ServicesFactory.GetServicesManager().GetService<CoverControlEnvironment>();
string filename = Path.Combine(initcong.SavePath, "Export.txt");
StreamWriter sw = new StreamWriter(filename);
foreach (string str in strs)
{
sw.WriteLine(str);
}
sw.Close();
后来发现有一个问题,就是列名有中文字符并超过四个字的||英文字符超过八个字,\t就不对齐,一个全角的\t就占了四个占位符,类似这种:
“第一列啊”后面是一个制表符;“1”后面也是一个制表符,同一列不对齐是因为“第一列啊”已经占满了,所以后面这个\t就又占了一个“第一列啊”的长度;但是“1”这一行没有占满,所以“1”后面这个制表符会填满这一行的长度,后面的“name”就排在了“第一列啊”后面的第一个位置;
同理可得,只要取余4为0的都会是这种现象,即一个制表符占了四个汉字的长度;
知道规律就好处理了,若当前列的title长度取余4为0,那么这一列的内容后面都多加一个制表符就好了;
代码实现:
public void saveTxt(DataTable strs){
if(strs == null)
{
return;
}
CoverControlEnvironment initcong = ServicesFactory.GetServicesManager().GetService<CoverControlEnvironment>();
string filename = "C:\\Export.txt";
StreamWriter sw = new StreamWriter(filename);
List<string> column = new List<string>();
int[] tArray = new int[strs.Columns.Count];//用于存每列的最大长度
int tIndex = 0;
foreach(DataColumn i in strs.Columns)
{
tArray[tIndex] = charLength(i.ToString());
column.Add(i.ToString() + "\t");
tIndex++;
}
column.Add("\r\n");
tIndex = 1;
int[] rowLen = new int[tArray.Length];
foreach (DataRow i in strs.Rows)
{
for (int index = 0; index < strs.Columns.Count; index++)
{
int length = charLength(i[index].ToString());
if (rowLen[index] < length)
{
rowLen[index] = length;
}
column.Add(i[index].ToString() + "\t");
if (tArray[index] > 4 && tArray[index] % 4 == 0 && rowLen[index] < tArray[index])
{
//列已经占了一个字节,需要多加一个制表符
column[column.Count - 1] += "\t";
}
}
tIndex++;
column.Add("\r\n");
}
//调整列格式
for (int index = 0; index < tArray.Length; index++)
{
if (tArray[index] < 8 && rowLen[index] > 8)
{
column[index] += "\t";//列后加制表符
}
}
//输出
foreach(string writeStr in column)
{
sw.Write(writeStr);
}
sw.Close();
Process vProcess = Process.Start("notepad.exe",filename);
}
public int charLength(string str) //取字符长度,1个中文字符占2位
{
int len = 0;
foreach (char i in str)
{
if (Convert.ToInt32(i) >= Convert.ToInt32(Convert.ToChar(128)))
{
len += 2;
continue;
}
len++;
}
return len;
}
这里还有一个问题就是如果行的长度大于列了,列后也要加制表符,所以多加了一个循环,用于对列的处理