MFC有关将列表控件写入Excel文件的问题

时间:2018-01-13 15:43:58

标签: excel mfc listcontrol

我正在编写一个功能,旨在将列表控件的内容转换为Excel文件。但我发现输出的格式不是我想要的。我的代码是

{
    CString buff0, buff1, buff2;
    CString fileName = _T("d:\\test.xls");//
    CFile file(fileName, CFile::modeCreate | CFile::modeReadWrite | 
                   CFile::shareExclusive);
    file.Write("A\tB\tC\n", 56);
    int i = 0;
    int j = 0;
    j = m_list.GetItemCount();
    if (j > 0)
    {
        for (i = 0; i<j; i++)
        {
            buff0 = _T("0"); % only for test, should be m_list.GetItemText()
            buff1 = _T("1"); % for test
            buff2 = _T("2"); % for test
            CString msg;
            msg.Format(_T("%s\t%s\t%s\n"), buff0, buff1, buff2);%  output each line to Excel
            file.Write(msg, msg.GetLength());
            }
        }
    }

我找到了msg.Format(_T(“%s \ t%s \ t \ t%s \ n”),buff0,buff1,buff2);没有按我的意愿执行。输出的Excel文件就像 enter image description here

但根据msg.Format(_T(“%s \ t%s \ t \ t%s \ n”),buff0,buff1,buff2),每一行应该是3个元素(0,1,2);

但是file.Write(“A \ tB \ tC \ n”,56);按照愿望执行。

任何人都知道问题是什么。非常感谢!

2 个答案:

答案 0 :(得分:1)

您正在使用UTF-16写入文件。 msg.GetLength()返回字符串中wchar_t的数量,这是缓冲区(在此示例中)的总长度的一半。如果以这种方式编写L"12345\n",它可能在ANSI中显示为" 1 2 3",其余字符串将丢失。

file.Write("A\tB\tC\n", 56)中,您分配了一个任意数字,56,它大于缓冲区,它恰好起作用。

您应该使用ANSI写入文件,或将UTF-16更改为UTF-8以保留Unicode。例如:

CStringA u8 = CW2A(_T("A\tB\tC\n"), CP_UTF8);
file.Write(u8, u8.GetLength());

for(...)
{
    buff0 = _T("0"); 
    buff1 = _T("1");
    buff2 = _T("2");
    CString msg;
    msg.Format(_T("%s\t%s\t%s\n"), 
            (LPCTSTR)buff0, (LPCTSTR)buff1, (LPCTSTR)buff2); 
    u8 = CW2A(msg, CP_UTF8);
    file.Write(u8, u8.GetLength());
}

答案 1 :(得分:0)

有一些优秀的库可以编写出色且功能丰富的xlsx Excel文件。喜欢: http://sourceforge.net/p/simplexlsx/wiki/Home/