【MFC学习二】CFileDialog导出文件


用CFileDialog导出文件,用户可指定文件名后缀等,感觉操作上比上文的 BROWSEINFO 更加人性化。

//将数据项写入CSV文件
int PutCSVItemLine(FILE *file, CStringArray &sItemLine)
{
    //准备行数据
    CStringA sLineString;

    //循环取子项
    for(INT_PTR nItem=0; nItem)
    {
        //取子项
        CStringA sItem(sItemLine.GetAt(nItem));

        //查找是否包含引号或逗号
        if(sItem.FindOneOf("\",\r\n") >= 0)
        {
            //单引号替换为双引号
            sItem.Replace("\"", "\"\"");

            //首尾用引号包含
            sItem.Insert(0, "\""); sItem += "\"";
        }

        //添加逗号分隔符
        if(!sLineString.IsEmpty()) sLineString += ",";

        //追加数据
        sLineString += sItem;
    }

    //行尾添加\r\n
    sLineString += "\r\n";

    //写入文件
    return (int) fwrite((LPCSTR)sLineString, 1, sLineString.GetLength(), file);

}
void DLG_FuncPwdList::OnBnClickedExport()
{
    // TODO: 在此添加控件通知处理程序代码
    CString strFilter, defaultFileName, finalFileName;
    SYSTEMTIME t;
    GetLocalTime(&t);
    defaultFileName.Format(_T("功能密码%d%d%d%d%d%d"),t.wYear,t.wMonth,t.wDay, t.wHour, t.wMinute, t.wSecond);

    //
    strFilter = "Excel文件 (*.csv)|*.csv|文本文件 (*.txt)|*.txt||";
    CFileDialog TmpDlg(FALSE, _T("csv"), defaultFileName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, strFilter.GetBuffer(), this);

    if (TmpDlg.DoModal() == IDOK)    
    {    
        //获取文件路径
        finalFileName = TmpDlg.GetPathName();
        CString fileExt = TmpDlg.GetFileExt();

        //导出文件
        FILE *f = NULL;
        if(_tfopen_s(&f, finalFileName, _T("wb")) == 0)
        {
            //标题
            CStringArray sLine;
            sLine.Add(_T("序号"));
            sLine.Add(_T("功能名称"));
            sLine.Add(_T("密码"));
            PutCSVItemLine(f, sLine);
            for(int i=0;i)
            {
                sLine.RemoveAll();
                CString tmp;
                tmp.Format(_T("%d"),FuncPwdList[i].FuncId);
                sLine.Add(tmp);
                sLine.Add(FuncPwdList[i].FuncName);
                if(fileExt.CompareNoCase(_T("csv")) == 0)
                {
                    tmp.Format(_T("\t%s\t"),FuncPwdList[i].Pwd);//处理开头为0的数字字符串
                }
                else
                {
                    tmp.Format(_T("%s"),FuncPwdList[i].Pwd);
                }
                sLine.Add(tmp);
                PutCSVItemLine(f, sLine);
            }
            fclose(f);
        }
        CString msg = "导出成功!文件路径:" + finalFileName;        
        AfxMessageBox(msg);
        return;
    }
    return;
}

相关