MFC中List Control内容写入Excel格式异常问题求助
问题分析与解决方案
从你的代码来看,主要有几个导致格式异常的问题,咱们逐个拆解:
1. 编码不匹配与字节数计算错误
你表头用的是ANSI窄字符串("A\tB\tC\n"),但后续用_T宏定义的CString是宽字符字符串(Unicode编码),两者编码不一致会导致Excel解析混乱。而且CFile::Write的第二个参数是字节数,但你用了msg.GetLength()——这个返回的是宽字符的个数,每个宽字符占2字节,所以实际写入的字节数只有需要的一半,内容自然显示不对。
2. 换行符不兼容
Excel解析CSV格式时,标准的换行是\r\n(回车+换行),而你只用了\n,虽然表头可能碰巧生效,但宽字符环境下这个换行符的解析会出问题。
3. 更简便的文件操作方式
直接用CFile处理文本其实不太方便,推荐用CStdioFile,它专门用于文本文件操作,会自动处理编码和换行符的转换。
修正后的代码示例
CString fileName = _T("d:\\test.xls"); // 用CStdioFile以Unicode模式打开文件 CStdioFile file; if (!file.Open(fileName, CFile::modeCreate | CFile::modeWrite | CFile::typeUnicode)) { // 处理打开失败的情况 AfxMessageBox(_T("文件打开失败!")); return; } // 写入表头,用_T宏统一编码 CString strHeader = _T("A\tB\tC\r\n"); file.WriteString(strHeader); int itemCount = m_list.GetItemCount(); if (itemCount > 0) { for (int i = 0; i < itemCount; i++) { // 替换成实际的List Control内容 CString buff0 = m_list.GetItemText(i, 0); CString buff1 = m_list.GetItemText(i, 1); CString buff2 = m_list.GetItemText(i, 2); CString msg; msg.Format(_T("%s\t%s\t%s\r\n"), buff0, buff1, buff2); file.WriteString(msg); } } file.Close();
额外说明
- 如果必须用
CFile,那要确保编码统一,并且正确计算字节数:// 写入宽字符时,字节数是字符数*sizeof(TCHAR) file.Write(msg.GetString(), msg.GetLength() * sizeof(TCHAR)); - 另外,直接写
.xls后缀其实是CSV格式,Excel能识别,但如果要真正的Excel格式(比如.xlsx),建议用OLE或者第三方库,不过你的场景用CSV足够了。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

