天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 34|回复: 0

【MFC编程】MFC将ListCtrl列表导出到Excel-采用文件流写Excel兼...

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
如标题所言,将ListCtrl的内容导出到Excel文件。不需要Excel环境支持!


        TCHAR szFilter[] = _T("Excel文件(*.xls)|*.xls|所有文件(*.*)|*.*||");   
        CFileDialog file(FALSE, _T(".xls"), _T("TransForm"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this);  

        CString strSavePath = _T(""); //!<保存路径  
        if(IDOK == file.DoModal())  
        {  
                strSavePath = file.GetPathName();  
        }

        //!<导出的xls文件路径
        if (strSavePath != _T(""))
        {
                std::string szTitle = "TransForm";
                std::string szHander = "";
                szHander = "<html xmlns:x=\"urn:schemas-microsoft-com:office:excel\"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets>";
                szHander = szHander + "<x:ExcelWorksheet><x:Name>" + CFunLib::MakeSafeHTMLText(szTitle)
                        + "</x:Name><x:WorksheetOptions><x:Print><x:ValidPrinterInfo /></x:Print></x:WorksheetOptions>";
                szHander += "</x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\" /><style type=\"text/css\">td {mso-number-format:''\@'';}</style></head><body><div><table><tr>";

                //!<html结束符号
                std::string szEnd = "</table> </body></html>";
                std::string szTR = "<tr>";  
                std::string        szEndTR = "</tr>";

                CHeaderCtrl* pHeaderCtrl = m_lstResult.GetHeaderCtrl();
                int nCloumn = pHeaderCtrl->GetItemCount(); ///列数
                std::fstream file;
                file.open(strSavePath, std::ios_base::out);
                file.write(szHander.c_str(), szHander.length());

                //!<写入标题行
                std::string szFiled = "<td></td><td align=\"center\" valign=\"middle\" height=\"50\"> [b]"
                        + CFunLib::MakeSafeHTMLText(szTitle) + " [/b]</td></tr><tr></tr>";
                file.write(szFiled.c_str(), szFiled.length());
                file.write(szTR.c_str(), szTR.length());

                //!<根据列头写单元格
                char szText[MAX_PATH] = {0};
                LVCOLUMN LvColumn;
                LvColumn.mask = LVCF_TEXT;
                LvColumn.pszText = szText; //!<标题名称
                LvColumn.cchTextMax = MAX_PATH;
                for (int i = 0; i < nCloumn; ++i)
                {
                        if(m_lstResult.GetColumnWidth(i) <= 0) continue; //!<如果列宽为0则视为隐藏
                        m_lstResult.GetColumn(i, &LvColumn);
                        szFiled = "<td>" + CFunLib::MakeSafeHTMLText(LvColumn.pszText) + "</td>";
                        file.write(szFiled.c_str(), szFiled.length());
                }

                file.write(szEndTR.c_str(), szEndTR.length());

                CString strValue = _T("");
                int nItemsCount = m_lstResult.GetItemCount(); //!<获取列表总行数
                if (nItemsCount > 0)
                {
                        for(int i = 0; i < nItemsCount; ++i) //!<一行一行的写,遍历行在外层循环
                        {
                                file.write(szTR.c_str(), szTR.length());
                                for (int j = 0; j < nCloumn; ++j)
                                {
                                        if(m_lstResult.GetColumnWidth(j) <= 0) continue;
                                        strValue = m_lstResult.GetItemText(i, j);
                                        szFiled = "<td>" + CFunLib::MakeSafeHTMLText(strValue.operator LPCTSTR()) + "</td>";
                                        file.write(szFiled.c_str(), szFiled.length());
                                }
                                file.write(szEndTR.c_str(), szEndTR.length());
                        }
                        file.write(szEndTR.c_str(), szEndTR.length());
                }

                file.close();


                ShellExecute(NULL, _T("open"), strSavePath, NULL, NULL, SW_SHOW);
        }










std::string MakeSafeHTMLText(const std::string& v_szContent)
{
        std::string szResult = "";
        for (int i = 0; i < v_szContent.length(); ++i)
        {
                char ch = v_szContent[i];
                switch(ch)
                {
                case '<':
                        szResult += "<";
                case '>':
                        szResult += ">";
                case '&':
                        szResult += "&";
                case '"':
                        szResult += """;
                case '\'':
                        szResult += "'";
                        break;
                default:
                        szResult += ch;
                        break;
                }
        }
        return szResult;
}

 

 

 

 

【MFC编程】MFC将ListCtrl列表导出到Excel-采用文件流写Excel兼...
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 10:21 , Processed in 0.143597 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表