C# 表格导出txt格式制表符问题原因

//这个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;
    }

这里还有一个问题就是如果行的长度大于列了,列后也要加制表符,所以多加了一个循环,用于对列的处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值