📄 textview.cpp
字号:
if( pSender != this && lHint == WM_OUTBAR_GOTO )
{
CListCtrl &lst = GetListCtrl();
POSITION pos = lst.GetFirstSelectedItemPosition();
while( pos != NULL )
{
int nSel = lst.GetNextSelectedItem(pos);
lst.SetItemState(nSel, ~LVIS_SELECTED, LVIS_SELECTED);
}
int nItem = (int)pHint;
lst.SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);
lst.EnsureVisible(nItem, TRUE);
this->SetFocus();
}
}
BOOL CTextView::ImportTxtFromExcel( LPCTSTR pszFileName )
{
_ASSERTE( pszFileName != NULL );
CListCtrl &lst = GetListCtrl();
int nListRowCount = lst.GetItemCount();
int nListColCount = lst.GetHeaderCtrl()->GetItemCount();
if( 0 == nListColCount )
{
AfxMessageBox(_T("List column can't be empty!"));
return FALSE;
}
CMMIRes &mmires = g_theApp.m_MMIRes;
///////////////////////////////////////////////////////////////
_Application ExcelApp;
Workbooks wbsWorkbooks;
_Workbook wbWorkbook;
Worksheets wssWorksheets;
_Worksheet wsWorksheet;
LPDISPATCH lpdisp;
//创建 Excel 服务器(启动Excel)
if (!ExcelApp.CreateDispatch(_T("Excel.Application"),NULL))
{
AfxMessageBox(_T("create Excel server fail!"));
return FALSE;
}
COleVariant covOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
COleVariant covFalse((short)FALSE);
wbsWorkbooks.AttachDispatch(ExcelApp.GetWorkbooks());
lpdisp=wbsWorkbooks.Open(pszFileName, //初始化.
covOpt,covOpt,covOpt,covOpt,covOpt,covOpt,covOpt,covOpt,covOpt,covOpt,covOpt,covOpt,covOpt,covOpt);
wbWorkbook.AttachDispatch(lpdisp);
wssWorksheets.AttachDispatch(wbWorkbook.GetWorksheets(),true);
wsWorksheet.AttachDispatch(wssWorksheets.GetItem(_variant_t("Sheet1")));
Range rgUsedRange;
rgUsedRange.AttachDispatch(wsWorksheet.GetUsedRange());
VARIANT ret;
//ret = rgUsedRange.GetValue2();
ret = rgUsedRange.GetValue(covOpt);
COleSafeArray sa(ret);
long lNumRows;
long lNumCols;
sa.GetUBound(1,&lNumRows);
sa.GetUBound(2,&lNumCols);
long index[2];
VARIANT var;
CStringArray aRow;
CString strID = _T("");
CString strCell;
int i,j;
///检测列数和列名
if(lNumCols == 0)
{
AfxMessageBox(_T("Sheet1 doesn't exist or is empty!"));
wbWorkbook.Close(covFalse,COleVariant(pszFileName),covOpt);
wbsWorkbooks.Close();
ExcelApp.Quit();
return FALSE;
}
if(nListColCount > lNumCols)
{
AfxMessageBox(_T("The number of Sheet1's columns must be\nequal to the mumber of List's columns!"));
wbWorkbook.Close(covFalse,COleVariant(pszFileName),covOpt);
wbsWorkbooks.Close();
ExcelApp.Quit();
return FALSE;
}
//检测列名
_TCHAR szField[256];
HDITEM hdItem;
hdItem.mask = HDI_TEXT;
hdItem.pszText = szField;
hdItem.cchTextMax = 256;
for(i = 0; i < lNumCols; i++)
{
lst.GetHeaderCtrl()->GetItem(i,&hdItem);
CString strField(szField);
index[0]=1;
index[1]=i+1;
sa.GetElement(index,&var);
strCell= VariantToCString(var);
if(strField.CompareNoCase(strCell)!=0)
{
AfxMessageBox(_T("The names of Sheet1's columns must\nmatch with the names of the List's columns!"));
wbWorkbook.Close(covFalse,COleVariant(pszFileName),covOpt);
wbsWorkbooks.Close();
ExcelApp.Quit();
return FALSE;
}
}
///检测结束
CStringArray arrLine;
//从Excel第二行读
for(i = 2;i<=lNumRows;i++)
{
aRow.RemoveAll();
//read first col
index[0]=i;
index[1]=1;
sa.GetElement(index,&var);
strCell= VariantToCString(var);
//ID
strID = strCell;
if(strID.IsEmpty())
continue;
else
lst.InsertItem( nListRowCount+i-2, strID );
for(j=2;j<=lNumCols;j++)
{
index[0]=i;
index[1]=j;
sa.GetElement(index,&var);
strCell= VariantToCString(var);
aRow.Add(strCell);
lst.SetItemText(nListRowCount+i-2,j-1,strCell);
}
if( mmires.AddTextEx( strID, aRow ) )
{
CDirFileNode * pRoot = (CDirFileNode *)m_pInfo->GetRoot();
CDirFileNode * pChild = (CDirFileNode *)m_pInfo->MallocNode();
if( NULL == pChild )
{
wbWorkbook.Close(covFalse,COleVariant(pszFileName),covOpt);
wbsWorkbooks.Close();
ExcelApp.Quit();
return FALSE;
}
_tcscpy( pChild->szID, strID );
m_pInfo->AddChild( pRoot, pChild );
lst.SetItemData(nListRowCount+i-2, (DWORD)pChild);
if(g_theApp.m_nPrecomposed != 0)
{
mmires.GetTextEx(strID,arrLine);
for(int k = 1; k<lNumCols;k++)
{
lst.SetItemText(i,k,arrLine.GetAt(k-1));
}
}
}
else
{
lst.DeleteItem(nListRowCount+i-2);
wbWorkbook.Close(covFalse,COleVariant(pszFileName),covOpt);
wbsWorkbooks.Close();
ExcelApp.Quit();
return FALSE;
}
}
/* for(i = 0;i<nExcelRowCount;i++)
{
aRow.RemoveAll();
for(j=0;j<nListColCount;j++)
{
//从Excel第二行读
varCell = rgRang.GetItem(COleVariant(long(i+2)),COleVariant(long(j+1)));
strCell= (LPCTSTR)(_bstr_t)varCell;
if(j==0)
strID = strCell;
else
aRow.Add(strCell);
}
if(strID.IsEmpty())
continue;
if( mmires.AddTextEx( strID, aRow ) )
{
lst.InsertItem( nListRowCount+i, strID );
for( k = 1; k < nListColCount; k++)
{
lst.SetItemText(nListRowCount+i,k,aRow.GetAt(k-1));
}
CDirFileNode * pRoot = (CDirFileNode *)m_pInfo->GetRoot();
CDirFileNode * pChild = (CDirFileNode *)m_pInfo->MallocNode();
if( NULL == pChild )
{
wbWorkbook.Close(covFalse,COleVariant(pszFileName),covOpt);
wbsWorkbooks.Close();
ExcelApp.Quit();
return FALSE;
}
_tcscpy( pChild->szID, strID );
m_pInfo->AddChild( pRoot, pChild );
lst.SetItemData(nListRowCount+i, (DWORD)pChild);
}
}
*/
wbWorkbook.Close(covFalse,COleVariant(pszFileName),covOpt);
wbsWorkbooks.Close();
ExcelApp.Quit();
///////////////////////////////////////////////////////
return TRUE;
}
BOOL CTextView::ExportTxtToExcel( LPCTSTR pszFileName )
{
_ASSERTE( pszFileName != NULL );
CListCtrl &lst = GetListCtrl();
int nTotalCol = lst.GetHeaderCtrl()->GetItemCount();
int nTotalRow = lst.GetItemCount();
if( nTotalCol == 0 || nTotalRow == 0)
return TRUE;
_Application ExcelApp;
Workbooks wbsWorkbooks;
_Workbook wbWorkbook;
Worksheets wssWorksheets;
_Worksheet wsWorksheet;
Range rgRang;
COleVariant covOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
COleVariant covTrue((short)TRUE);
COleVariant covFalse((short)FALSE);
//创建 Excel 服务器(启动Excel)
if (!ExcelApp.CreateDispatch(_T("Excel.Application"),NULL))
{
AfxMessageBox(_T("create Excel server fail!"));
return FALSE;
}
wbsWorkbooks.AttachDispatch(ExcelApp.GetWorkbooks());
wbWorkbook.AttachDispatch(wbsWorkbooks.Add(covOpt));
wssWorksheets.AttachDispatch(wbWorkbook.GetWorksheets());
wsWorksheet.AttachDispatch(wssWorksheets.GetItem(_variant_t("Sheet1")));
rgRang.AttachDispatch(wsWorksheet.GetCells());
_TCHAR szField[256];
HDITEM hdItem;
hdItem.mask = HDI_TEXT;
hdItem.pszText = szField;
hdItem.cchTextMax = 256;
int i,j;
for(i = 0; i < nTotalCol; i++)
{
lst.GetHeaderCtrl()->GetItem(i,&hdItem);
CString strField(szField);
rgRang.SetItem(COleVariant(long(1)),COleVariant(long(i+1)),COleVariant(strField));
}
CString strCell;
for(i = 0;i<nTotalRow;i++)
{
for(j=0;j<nTotalCol;j++)
{
strCell = lst.GetItemText(i,j);
rgRang.SetItem(COleVariant(long(i+2)),COleVariant(long(j+1)),COleVariant(strCell));
}
}
wbWorkbook.SaveCopyAs(COleVariant(pszFileName));
wbWorkbook.Close(covFalse,covOpt,covOpt);
wbsWorkbooks.Close();
ExcelApp.Quit();
return TRUE;
}
void CTextView::OnTextExportToExcel()
{
// TODO: Add your command handler code here
CFileDialog dlg(FALSE,
_T(".xls"),
_T("TEXT"),
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("Excel files (*.xls)|*.xls|"));
if(dlg.DoModal() == IDCANCEL)
return;
CString strFileName = dlg.GetPathName();
if( strFileName.IsEmpty() )
return;
int nChar = strFileName.ReverseFind('\\');
CString strName = strFileName.Right(strFileName.GetLength()-nChar-1);
CString str;
str.Format(_T("Microsoft Excel - %s"),strName);
HWND hWnd = ::FindWindow(NULL,str);
if(hWnd)
{
str.Format(_T("\"%s\" is open,\nplease close it first!"),strName);
AfxMessageBox(str);
return;
}
CWaitCursor waitCur;
if (CoInitialize(NULL)!=0)
{
AfxMessageBox(_T("initialize COM fail!"));
return;
}
if(ExportTxtToExcel(strFileName))
AfxMessageBox(IDS_EXPORT_COMPLETE);
CoUninitialize();
}
void CTextView::OnTextImportFormExcel()
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE,
_T(".xls"),
_T("TEXT"),
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_FILEMUSTEXIST,
_T("Excel files (*.xls)|*.xls|"));
if(dlg.DoModal() == IDCANCEL)
return;
CString strFileName = dlg.GetPathName();
if( strFileName.IsEmpty() )
return;
CFileFind ff;
if(ff.FindFile(_T("TEMP.xls")))
::DeleteFile(_T("TEMP.xls"));
CListCtrl &lst = GetListCtrl();
int nListRowCount = lst.GetItemCount();
if(nListRowCount != 0)
{
CWaitCursor waitCur;
if( AfxMessageBox(_T("Before importing,\nit will delete all items first,\nare you sure?"), MB_YESNO) == IDNO )
return;
CListCtrl &lst = GetListCtrl();
CWaitCursor waitCursor;
CDirFileNode * pNode = NULL;
CString strID;
for( int n = 0; n < nListRowCount; ++n )
{
strID = lst.GetItemText(n, 0);
g_theApp.m_MMIRes.DeleteTextEx(strID);
pNode = (CDirFileNode *)lst.GetItemData(n);
m_pInfo->RemoveNode(pNode);
}
lst.DeleteAllItems();
}
CWaitCursor waitCur;
if (CoInitialize(NULL)!=0)
{
AfxMessageBox(_T("initialize COM fail!"));
return;
}
if(ImportTxtFromExcel(strFileName))
AfxMessageBox(IDS_IMPORT_COMPLETE);
else
AfxMessageBox(_T("Import Failed!"));
SetModifiedFlag();
CoUninitialize();
}
void CTextView::OnUpdateTextImportFormExcel(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
void CTextView::OnUpdateTextExportToExcel(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
CListCtrl &ls = GetListCtrl();
pCmdUI->Enable( ls.GetSelectedCount() > 0 );
}
void CTextView::OnUpdateTextDelAllItem(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
CListCtrl &ls = GetListCtrl();
pCmdUI->Enable( ls.GetItemCount() > 0 );
}
void CTextView::OnUpdateTextFindItem(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
CListCtrl &ls = GetListCtrl();
pCmdUI->Enable( ls.GetItemCount() > 0 );
}
CString CTextView::VariantToCString(VARIANT var)
{
CString strValue;
time_t cur_time;
CTime time_value;
COleCurrency var_currency;
switch(var.vt)
{
case VT_EMPTY:
strValue=_T("");
break;
case VT_UI1:
strValue.Format(_T("%d"),var.bVal);
break;
case VT_I2:
strValue.Format(_T("%d"),var.iVal);
break;
case VT_I4:
strValue.Format(_T("%d"),var.lVal);
break;
case VT_R4:
strValue.Format(_T("%f"),var.fltVal);
break;
case VT_R8:
strValue.Format(_T("%f"),var.dblVal);
break;
case VT_CY:
var_currency=var;
strValue=var_currency.Format(0);
break;
case VT_BSTR:
strValue.Format (_T("%s"),(CString)var.bstrVal);
break;
case VT_NULL:
strValue=_T("");
break;
case VT_DATE:
cur_time = (long)var.date;
time_value=cur_time;
strValue=time_value.Format(_T("%A,%B%d,%Y"));
break;
case VT_BOOL:
strValue.Format(_T("%d"),var.boolVal );
break;
default:
strValue=_T("");
break;
}
return strValue;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -