📄 sclistcsv.cpp
字号:
// ScListCSV.cpp : implementation file
//
#include "stdafx.h"
#include "agsm2.h"
#include "ScListCtrl.h"
#include "ScListCSV.h"
#include "Helper.h"
#include "ref/csv.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CScListExportCSV dialog
CScListExportCSV::CScListExportCSV(CWnd* pParent /*=NULL*/)
: CDialog(CScListExportCSV::IDD, pParent)
{
//{{AFX_DATA_INIT(CScListExportCSV)
m_ExportFile = _T("");
m_bComOpen = TRUE;
//}}AFX_DATA_INIT
m_pExportWhat = NULL;
}
void CScListExportCSV::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CScListExportCSV)
DDX_Control(pDX, IDC_LIST_EXPORT, m_listExport);
DDX_Text(pDX, IDC_EDIT_EXPORT, m_ExportFile);
DDX_Check(pDX, IDC_CHECK_COMOPEN, m_bComOpen);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CScListExportCSV, CDialog)
//{{AFX_MSG_MAP(CScListExportCSV)
ON_BN_CLICKED(IDC_BUTTON_BROWSER, OnButtonBrowser)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CScListExportCSV message handlers
/////////////////////////////////////////////////////////////////////////////
// CScListImportCSV dialog
CScListImportCSV::CScListImportCSV(CWnd* pParent /*=NULL*/)
: CDialog(CScListImportCSV::IDD, pParent)
{
//{{AFX_DATA_INIT(CScListImportCSV)
m_ImportFile = _T("");
//}}AFX_DATA_INIT
}
void CScListImportCSV::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CScListImportCSV)
DDX_Control(pDX, IDC_LIST_IMPORT, m_listImport);
DDX_Text(pDX, IDC_EDIT_IMPORT, m_ImportFile);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CScListImportCSV, CDialog)
//{{AFX_MSG_MAP(CScListImportCSV)
ON_BN_CLICKED(IDC_BUTTON_BROWSER, OnButtonBrowser)
ON_NOTIFY(NM_CLICK, IDC_LIST_IMPORT, OnClickListImport)
ON_NOTIFY(NM_DBLCLK, IDC_LIST_IMPORT, OnDblclkListImport)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CScListImportCSV message handlers
void CScListExportCSV::ExportScList(CScListCtrl *pScList)
{
m_pExportWhat = pScList;
}
void CScListImportCSV::ImportScList(CScListCtrl *pScList)
{
m_pImportTo = pScList;
}
BOOL CScListExportCSV::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_listExport.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT );
m_listExport.InsertColumn(0,_T(""),LVCFMT_LEFT,80);
LVCOLUMN col;
int i = 0;
TCHAR TxtBuf[256];
col.mask = LVCF_TEXT;
col.pszText = TxtBuf;
col.cchTextMax = 256;
do{
if(m_pExportWhat->GetColumn(i, &col))
{
m_listExport.InsertItem(i,col.pszText);
i++;
}else
break;
}while(1);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CScListExportCSV::OnButtonBrowser()
{
// TODO: Add your control notification handler code here
UpdateData();
CString strExt(_T("csv"));
CString strTitle((LPCSTR)IDS_STRING_SAVE_AS);
CString strFilter((LPCSTR)IDS_DEFAULTCSVFILTERS);
CFileDialog fileDialog(TRUE, strExt, NULL, OFN_ENABLESIZING | OFN_HIDEREADONLY,
strFilter, this);
fileDialog.m_ofn.lpstrTitle = strTitle;
int ret = fileDialog.DoModal();
if (IDOK == ret)
{
CString strPathName = fileDialog.GetPathName();
if (!strPathName.IsEmpty())
{
m_ExportFile = strPathName;
UpdateData(FALSE);
}
}
}
void CScListExportCSV::OnOK()
{
// TODO: Add extra validation here
if(m_ExportFile.IsEmpty())
{
AfxMessageBox(IDS_STRING134);
return ;
}
int nCount = m_listExport.GetItemCount();
int last = -1;
for(int j=0; j<nCount; j++)
{
if(m_listExport.GetCheck(j))
last = j;
}
if(last == -1)
{
AfxMessageBox(IDS_STRING135);
return;
}
FILE *fout = NULL;
char mode[] = "a";
if( (fout = fopen(m_ExportFile, "r" )) != NULL )
{
fclose(fout);
fout = NULL;
CString str;
CString format((LPCSTR)IDS_STRING136);
str.Format(format,m_ExportFile);
int iRet = AfxMessageBox(str,MB_YESNOCANCEL);
if(iRet == IDCANCEL)
return;
else if(iRet == IDYES )
strcpy(mode,"w");
else if(iRet == IDNO)
strcpy(mode,"a");
}
for(j=0; j<nCount; j++)
{
if(m_listExport.GetCheck(j))
{
if(fout == NULL)
{
fout = fopen(m_ExportFile,mode);
if(fout == NULL)
{
Helper::ShowLastError();
return;
}
}
if(j == last)
fprintf(fout,"%s",m_listExport.GetItemText(j,0));
else
fprintf(fout,"%s,",m_listExport.GetItemText(j,0));
}
}
if(last != -1)
{
fprintf(fout,"\n");
}
BOOL newline = FALSE;
for(int i=0; i<m_pExportWhat->GetItemCount(); i++)
{
for(j=0; j<nCount; j++)
{
if(m_listExport.GetCheck(j))
{
CString str = m_pExportWhat->GetItemText(i,j);
if(!str.IsEmpty())
newline = TRUE;
}
}
if(!newline)
continue;
for(j=0; j<nCount; j++)
{
if(m_listExport.GetCheck(j))
{
CString str = m_pExportWhat->GetItemText(i,j);
//CSV encoding...
if(str.FindOneOf(",\r\n\"") != -1)
{
str.Replace("\"","\"\"");//Microsot's 通讯簿 don't do this
str.Insert(0,'\"');
str.Insert(str.GetLength(),'\"');
TRACE("new CSV String %s\n",str);
}
if(j == last)
fprintf(fout,"%s",str);
else
fprintf(fout,"%s,",str);
}
}
fprintf(fout,"\n");
newline = FALSE;
}
fclose(fout);
CDialog::OnOK();
if(m_bComOpen)
{
ShellExecute(
NULL,
TEXT("open"),
m_ExportFile,
NULL,
NULL,
SW_SHOWNORMAL);
}
}
BOOL CScListImportCSV::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_listImport.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT );
CString txt((LPCSTR)IDS_STRING_TEXT);
CString mapto((LPCSTR)IDS_STRING_MAP_TO);
m_listImport.InsertColumn(0,txt,LVCFMT_LEFT,80);
m_listImport.InsertColumn(1,mapto,LVCFMT_LEFT,80);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CScListImportCSV::OnButtonBrowser()
{
// TODO: Add your control notification handler code here
CString strExt(_T("csv"));
CString strTitle((LPCSTR)IDS_STRING_OPEN_FILE);
CString strFilter((LPCSTR)IDS_DEFAULTCSVFILTERS);
CString colFormat((LPCSTR)IDS_STRING_COL);
CFileDialog fileDialog(TRUE, strExt, NULL, OFN_ENABLESIZING | OFN_FILEMUSTEXIST| OFN_HIDEREADONLY,
strFilter, this);
fileDialog.m_ofn.lpstrTitle = strTitle;
int ret = fileDialog.DoModal();
if (IDOK == ret)
{
CString strPathName = fileDialog.GetPathName();
if (!strPathName.IsEmpty())
{
m_ImportFile = strPathName;
UpdateData(FALSE);
fin = fopen(m_ImportFile,"r");
if(fin == NULL)
{
Helper::ShowLastError();
return;
}
int iRet = csv_row_fread(fin,
buf,1024,
row, 32,
',', CSV_TRIM | CSV_QUOTES);
LVCOLUMN col;
TCHAR TxtBuf[256];
col.mask = LVCF_TEXT;
col.pszText = TxtBuf;
col.cchTextMax = 256;
//探测第一行是否为域名称
BOOL have_match = FALSE;
int cols[32];
memset(cols,-1,32*sizeof(int));
int i=0;
while(row[i])
{
int nCols = m_pImportTo->GetHeaderCtrl()->GetItemCount();
for(int j=0; j<nCols; j++)
{
if(m_pImportTo->GetColumn(j, &col))
{
if(!strcmp(TxtBuf,(const char *)row[i]))
{
have_match = TRUE;
cols[i] = j;
break;
}
}
}
i++;
}
if(have_match)//第一行是域名称
{
int iRet = csv_row_fread(fin,
buf,1024,
row, 32,
',', CSV_TRIM | CSV_QUOTES);
i=0;
while(row[i])
{
CString str = row[i];
if(str.IsEmpty())
str.Format(colFormat,i);
m_listImport.InsertItem(i,str);
if(cols[i] != -1)
{
m_pImportTo->GetColumn(cols[i],&col);
m_listImport.SetItem(i,1,LVIF_TEXT,
col.pszText,
0,0,0,0);
m_listImport.SetCheck(i);
}
i++;
}
}else{//第一行不是域名称
i=0;
while(row[i])
{
CString str = row[i];
if(str.IsEmpty())
str.Format(colFormat,i);
m_listImport.InsertItem(i,str);
i++;
}
}
//if(fin)
// fclose(fin);
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CChangeMapDlg dialog
CChangeMapDlg::CChangeMapDlg(CWnd* pParent /*=NULL*/)
: CDialog(CChangeMapDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CChangeMapDlg)
m_MapWhat = _T("");
//}}AFX_DATA_INIT
}
void CChangeMapDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CChangeMapDlg)
DDX_Control(pDX, IDC_COMBO_MAPTO, m_comboMapTo);
DDX_Text(pDX, IDC_STATIC_TXT, m_MapWhat);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CChangeMapDlg, CDialog)
//{{AFX_MSG_MAP(CChangeMapDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CChangeMapDlg message handlers
void CScListImportCSV::OnClickListImport(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
// TODO: Add your control notification handler code here
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
int iItem = pNMListView->iItem;
CPoint ptAction;
UINT nFlags;
GetCursorPos(&ptAction);
m_listImport.ScreenToClient(&ptAction);
iItem = m_listImport.HitTest(ptAction, &nFlags);
TRACE(_T("%d\n"),nFlags);
TRACE(_T("%d %d %d %d %d %d %d %d\n"),
LVHT_NOWHERE ,LVHT_ONITEMICON,
LVHT_ONITEMLABEL,LVHT_ONITEMSTATEICON,
LVHT_ABOVE, LVHT_BELOW,
LVHT_TORIGHT, LVHT_TOLEFT);
if(nFlags & LVHT_ONITEMSTATEICON)
{
CString map;
map = m_listImport.GetItemText(iItem,1);
if(map.IsEmpty() && !m_listImport.GetCheck(iItem))
{
CChangeMapDlg dlg;
dlg.m_MapWhat = m_listImport.GetItemText(iItem,0);
dlg.m_listMapTo = m_pImportTo;
dlg.DoModal();
TRACE(_T("%s\n"),dlg.m_strMapTo);
if(!dlg.m_strMapTo.IsEmpty())
{
for(int i=0; i<m_listImport.GetItemCount(); i++)
{
CString str = m_listImport.GetItemText(i,1);
if(str == dlg.m_strMapTo)
{
m_listImport.SetItem(i,1,LVIF_TEXT,
_T(""),
0,0,0,0);
m_listImport.SetCheck(i,FALSE);
}
}
m_listImport.SetItem(iItem,1,LVIF_TEXT,
dlg.m_strMapTo,
0,0,0,0);
//m_listImport.SetCheck(iItem,FALSE);
}else{
m_listImport.SetCheck(iItem,TRUE);
}
}
}
*pResult = 0;
}
BOOL CChangeMapDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
int nCount = m_listMapTo->GetHeaderCtrl()->GetItemCount();
LVCOLUMN col;
TCHAR TxtBuf[256];
col.mask = LVCF_TEXT;
col.pszText = TxtBuf;
col.cchTextMax = 256;
for(int i=0; i<nCount; i++)
{
m_listMapTo->GetColumn(i,&col);
m_comboMapTo.AddString(col.pszText);
}
if(!m_strMapTo.IsEmpty())
m_comboMapTo.SelectString(0,m_strMapTo);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CChangeMapDlg::OnOK()
{
// TODO: Add extra validation here
int iCur = m_comboMapTo.GetCurSel();
if(iCur != CB_ERR )
{
m_comboMapTo.GetLBText(
iCur,
m_strMapTo);
}else
m_strMapTo = _T("");
CDialog::OnOK();
}
void CScListImportCSV::OnDblclkListImport(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
// TODO: Add your control notification handler code here
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
int iItem = pNMListView->iItem;
CString map;
map = m_listImport.GetItemText(iItem,1);
CChangeMapDlg dlg;
dlg.m_MapWhat = m_listImport.GetItemText(iItem,0);
dlg.m_listMapTo = m_pImportTo;
dlg.m_strMapTo = map;
dlg.DoModal();
TRACE(_T("%s\n"),dlg.m_strMapTo);
if(!dlg.m_strMapTo.IsEmpty())
{
for(int i=0; i<m_listImport.GetItemCount(); i++)
{
CString str = m_listImport.GetItemText(i,1);
if(str == dlg.m_strMapTo)
{
m_listImport.SetItem(i,1,LVIF_TEXT,
_T(""),
0,0,0,0);
m_listImport.SetCheck(i,FALSE);
}
}
m_listImport.SetItem(iItem,1,LVIF_TEXT,
dlg.m_strMapTo,
0,0,0,0);
}
*pResult = 0;
}
void CScListImportCSV::OnOK()
{
// TODO: Add extra validation here
//当前内容是空吗?
BOOL list_is_empty = TRUE;
int i =0,j=0;
int nCols = m_pImportTo->GetHeaderCtrl()->GetItemCount();
CString tmp_str;
for(i=0; i<m_pImportTo->GetItemCount(); i++)
{
for(j=1; j<nCols; j++)
{
tmp_str = m_pImportTo->GetItemText(i,j);
if(!tmp_str.IsEmpty())
{
list_is_empty = FALSE;
break;
}
}
}
int nItem = 0;
if(!list_is_empty)
{
int iRet = AfxMessageBox(IDS_STRING141,MB_YESNOCANCEL);
if(iRet == IDCANCEL)
return;
else if(iRet == IDYES )
m_pImportTo->DeleteAllItems();
else if(iRet == IDNO)
nItem = m_pImportTo->GetItemCount();
}
//判断填加到哪一列.
int cols[32];
memset(cols,-1,32*sizeof(int));
BOOL have_col0 = FALSE;
LVCOLUMN col;
TCHAR TxtBuf[256];
col.mask = LVCF_TEXT;
col.pszText = TxtBuf;
col.cchTextMax = 256;
int nCount = m_listImport.GetItemCount();
for(i=0; i<nCount; i++)
{
if(m_listImport.GetCheck(i))
{
for(j=0; j<nCols; j++)
{
if(m_pImportTo->GetColumn(j, &col))
{
tmp_str = m_listImport.GetItemText(i,1);
if(TxtBuf == tmp_str)
{
cols[i] = j;
if(j == 0)
have_col0 = TRUE;
break;
}
}
}
}
}
//开始填加
int iRet;
do{
i=0;
if(!have_col0 && !list_is_empty)
{
tmp_str.Format("%d",nItem+1);
m_pImportTo->AddItem(nItem,0,tmp_str);
}
while(row[i])
{
if(cols[i] == 0 && !list_is_empty)
{
tmp_str.Format("%d",nItem+1);
m_pImportTo->AddItem(nItem,0,tmp_str);
}else if(cols[i] != -1)
{
m_pImportTo->AddItem(nItem,cols[i],(const char *)row[i]);
}
i++;
}
iRet = csv_row_fread(fin,
buf,1024,
row, 32,
',', CSV_TRIM | CSV_QUOTES);
nItem++;
}while(iRet>0);
fclose(fin);
CDialog::OnOK();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -