关于将列表控件写入 Excel 文件的 MFC 问题
MFC Problems about write a List Control to an Excel file
我正在编写一个函数,旨在将列表控件的内容写入 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%s\n"), buff0, buff1, buff2);没有按我的意愿执行。输出 Excel 文件就像
但是根据msg.Format(_T("%s\t%s\t%s\n每行应该是3个元素(0,1,2) "), buff0, buff1, buff2);
但是file.Write("A\tB\tC\n", 56);如愿以偿。
任何人都知道问题出在哪里。非常感谢!
您正在以 UTF-16 格式写入文件。 msg.GetLength()
returns 字符串中 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());
}
有一些优秀的库可以编写漂亮且功能丰富的 xlsx Excel 文件。像:
http://sourceforge.net/p/simplexlsx/wiki/Home/
我正在编写一个函数,旨在将列表控件的内容写入 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%s\n"), buff0, buff1, buff2);没有按我的意愿执行。输出 Excel 文件就像
但是根据msg.Format(_T("%s\t%s\t%s\n每行应该是3个元素(0,1,2) "), buff0, buff1, buff2);
但是file.Write("A\tB\tC\n", 56);如愿以偿。
任何人都知道问题出在哪里。非常感谢!
您正在以 UTF-16 格式写入文件。 msg.GetLength()
returns 字符串中 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());
}
有一些优秀的库可以编写漂亮且功能丰富的 xlsx Excel 文件。像: http://sourceforge.net/p/simplexlsx/wiki/Home/