📄 commprintdlg.cpp
字号:
// CommPrintDlg.cpp : implementation file
//
#include "stdafx.h"
#include "clientmain.h"
#include "CommPrintDlg.h"
#include <string>
#include <algorithm>
#include "msword.h"
#include "excel.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
using namespace std;
/////////////////////////////////////////////////////////////////////////////
// CCommPrintDlg dialog
CCommPrintDlg::CCommPrintDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCommPrintDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCommPrintDlg)
m_strTitle = _T("");
//}}AFX_DATA_INIT
m_strSql = L"";
}
void CCommPrintDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCommPrintDlg)
DDX_Control(pDX, IDC_BTN_EXCEL, m_btnExcel);
DDX_Control(pDX, IDC_BTN_WORD, m_btnWord);
DDX_Control(pDX, IDC_LIST_SOURCE, m_lstSource);
DDX_Control(pDX, IDC_LIST_DEST, m_lstDest);
DDX_Text(pDX, IDC_EDIT_TITLE, m_strTitle);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCommPrintDlg, CDialog)
//{{AFX_MSG_MAP(CCommPrintDlg)
ON_LBN_DBLCLK(IDC_LIST_SOURCE, OnDblclkListSource)
ON_LBN_DBLCLK(IDC_LIST_DEST, OnDblclkListDest)
ON_BN_CLICKED(IDC_BTN_ADD, OnBtnAdd)
ON_BN_CLICKED(IDC_BTN_DEL, OnBtnDel)
ON_BN_CLICKED(IDC_BTN_ADDALL, OnBtnAddall)
ON_BN_CLICKED(IDC_BTN_DELALL, OnBtnDelall)
ON_BN_CLICKED(IDC_BTN_QUIT, OnBtnQuit)
ON_BN_CLICKED(IDC_BTN_SETTING, OnBtnSetting)
ON_BN_CLICKED(IDC_BTN_WORD, OnBtnWord)
ON_BN_CLICKED(IDC_BTN_EXCEL, OnBtnExcel)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCommPrintDlg message handlers
void CCommPrintDlg::OnOK()
{
// TODO: Add extra validation here
//CDialog::OnOK();
}
void CCommPrintDlg::OnCancel()
{
// TODO: Add extra cleanup here
//CDialog::OnCancel();
}
void CCommPrintDlg::OnDblclkListSource()
{
// TODO: Add your control notification handler code here
TCHAR strList[256];
int nIndex;
nIndex = m_lstSource.GetCurSel();
if(nIndex >= 0)
{
m_lstSource.GetText(nIndex, strList);
m_lstDest.AddString(strList);
m_lstSource.DeleteString(nIndex);
}
}
void CCommPrintDlg::OnDblclkListDest()
{
// TODO: Add your control notification handler code here
TCHAR strList[256];
int nIndex;
nIndex = m_lstDest.GetCurSel();
if(nIndex >= 0)
{
m_lstDest.GetText(nIndex, strList);
m_lstSource.AddString(strList);
m_lstDest.DeleteString(nIndex);
}
}
void CCommPrintDlg::OnBtnAdd()
{
// TODO: Add your control notification handler code here
OnDblclkListSource();
}
void CCommPrintDlg::OnBtnDel()
{
// TODO: Add your control notification handler code here
OnDblclkListDest();
}
void CCommPrintDlg::OnBtnAddall()
{
// TODO: Add your control notification handler code here
int nCount;
TCHAR strList[256];
nCount = m_lstSource.GetCount();
for(int i = 0; i < nCount; i++)
{
m_lstSource.GetText(i, strList);
m_lstDest.AddString(strList);
}
while(nCount > 0)
{
m_lstSource.DeleteString(nCount-1);
nCount = m_lstSource.GetCount();
}
}
void CCommPrintDlg::OnBtnDelall()
{
// TODO: Add your control notification handler code here
int nCount;
TCHAR strList[256];
nCount = m_lstDest.GetCount();
for(int i = 0; i < nCount; i++)
{
m_lstDest.GetText(i, strList);
m_lstSource.AddString(strList);
}
while(nCount > 0)
{
m_lstDest.DeleteString(nCount-1);
nCount = m_lstDest.GetCount();
}
}
BOOL CCommPrintDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
// 为对话框添加图标
HICON hIcon = AfxGetApp()->LoadIcon(IDI_PRINT);
ASSERT(hIcon != NULL);
SetIcon(hIcon, TRUE);
// 为组合框添加选项
// 先开始对数据库进行操作
g_pAdoServer->CloseRecordset();
g_pAdoServer->OpenRecordset(m_strSql);
HRESULT hr;
VARIANT_BOOL bEmpty;
hr = g_pAdoServer->get_Empty(&bEmpty);
if(bEmpty)
{
MessageBox("当前记录集为空!", "Client Error:", MB_OK);
return FALSE;
}
long nCount;
string strName;
nCount = g_pAdoServer->FieldCount;
for(long i = 0 ; i < nCount; i++)
{
strName = (_bstr_t)g_pAdoServer->GetFieldName(i);
m_lstSource.AddString(strName.c_str());
}
return FALSE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CCommPrintDlg::OnBtnQuit()
{
// TODO: Add your control notification handler code here
int nRet;
nRet = MessageBox("确定要终止打印数据吗?", "退出打印", MB_YESNO );
if(nRet == IDYES)
{
CDialog::OnCancel();
}
}
void CCommPrintDlg::OnBtnSetting()
{
// TODO: Add your control notification handler code here
string strFld;
string strTemp;
string strSpace;
TCHAR strList[256];
int nCount;
strFld = "";
strSpace = ",";
nCount = m_lstDest.GetCount();
// 通过循环获取要打印字段的组合
if(nCount > 0)
{
for(int i = 0; i < nCount; i++)
{
m_lstDest.GetText(i, strList);
strTemp = strList;
if(strFld.empty())
{
strFld = strTemp;
}
else
{
strFld = strFld + strSpace + strTemp;
}
}
}
if(strFld.empty())
{
MessageBox("没有选择要打印的字段", "提示信息", MB_OK);
return;
}
string strSql;
strSql = m_strSql;
// 查找 "*" 的位置,然后用来替换字符串
string::size_type position = strSql.find('*');
strSql.replace(position, 1, strFld);
_bstr_t strBSql(strSql.c_str());
// 用新的SQL语句打开记录集
g_pAdoServer->CloseRecordset();
g_pAdoServer->OpenRecordset(strBSql);
// 检查记录集是否为空
HRESULT hr;
VARIANT_BOOL bEmpty;
hr = g_pAdoServer->get_Empty(&bEmpty);
if(bEmpty)
{
MessageBox("当前记录集为空!", "Client Error:", MB_OK);
return;
}
else
{
g_pAdoServer->Last();
g_pAdoServer->First(); // 上面两条语句确保能获取正确的记录个数
m_btnWord.EnableWindow();
m_btnExcel.EnableWindow();
UpdateData();
}
}
void CCommPrintDlg::OnBtnWord()
{
// TODO: Add your control notification handler code here
CWaitCursor wait;
_Application wordApp;
_Document wordDoc;
Documents wordDocs;
if(!wordApp.CreateDispatch("word.Application"))
{
AfxMessageBox("failed");
return ;
}
LPDISPATCH pDocs=wordApp.GetDocuments();
wordDocs.AttachDispatch(pDocs);
VARIANT varUnit;
VARIANT varOptional;
VariantInit(&varUnit);
varUnit.vt = VT_I4;
varUnit.lVal = 5;
// 可选参数的使用方法应该如下:
VariantInit(&varOptional);
varOptional.vt=VT_ERROR;
varOptional.scode =DISP_E_PARAMNOTFOUND;
LPDISPATCH pDoc = wordDocs.Add(&varOptional, &varOptional, &varOptional, &varOptional);
wordDoc.AttachDispatch(pDoc);
long nRows, nCols;
nCols = g_pAdoServer->FieldCount;
nRows = g_pAdoServer->RecordCount + 1;
Range wordRange= wordDoc.Range(&varOptional, &varOptional);
Selection wordSelec = wordApp.GetSelection();
_Font oFont;
_ParagraphFormat wordFormat;
//////////////设置标题////////////////////////////////////////
wordSelec.HomeKey(&varUnit, &varOptional);
oFont = wordSelec.GetFont();
oFont.SetSize(15);
oFont.SetName("黑体");
wordFormat = wordSelec.GetParagraphFormat();
wordFormat.SetAlignment(1);
wordSelec.InsertAfter(LPCSTR(m_strTitle));
wordSelec.InsertParagraphAfter();
wordSelec.EndKey(&varUnit, &varOptional);
////////////标题设置完毕/////////////////////////////////////
/////////////////开始设置表格部分///////////////////////////
wordRange = wordSelec.GetRange();
oFont = wordSelec.GetFont();
oFont.SetSize(12);
oFont.SetName("宋体");
wordFormat = wordSelec.GetParagraphFormat();
wordFormat.SetAlignment(1); // wdAlignParagraphCenter
VARIANT varTable;
VariantInit(&varTable);
varUnit.vt = VT_I4;
varUnit.lVal = 0;
// 设置表格,包括行数、列数以及边框样式
Tables wordTables = wordSelec.GetTables();
Table wordTable = wordTables.Add(wordRange, nRows, nCols, &varOptional, &varTable);
Borders tblBorders;
tblBorders = wordTable.GetBorders();
tblBorders.SetInsideLineStyle(1); // wdLineStyleSingle
tblBorders.SetOutsideLineStyle(7); // wdLineStyleDouble
Columns tblColumns;
tblColumns = wordTable.GetColumns();
tblColumns.SetPreferredWidthType(1); // wdPreferredWidthAuto
// 开始往表格中写入数据
long i, j, n;
string strValue;
Cell tblCell;
g_pAdoServer->First();
for(i = 1; i <= nRows; i++)
{
for(j = 1; j <= nCols; j++)
{
if(1 == i)
{
tblCell = wordTable.Cell(i, j);
wordRange = tblCell.GetRange();
oFont = wordRange.GetFont();
oFont.SetName("黑体"); // 设置表格头字体为黑体
n = j -1;
strValue = g_pAdoServer->FieldName[n];
wordRange.InsertAfter(strValue.c_str());
}
else
{
tblCell = wordTable.Cell(i, j);
wordRange = tblCell.GetRange();
n = j -1;
strValue = (_bstr_t)g_pAdoServer->Field[n];
wordRange.InsertAfter(strValue.c_str());
}
}
// 从i = 2的时候,才开始移动记录,i = 1的时候,取字段名
if(i>1)
{
g_pAdoServer->Next();
}
}
// 显示文档,并激活文档
wordApp.SetVisible(true);
wordDoc.Activate();
m_btnWord.EnableWindow(FALSE);
}
void CCommPrintDlg::OnBtnExcel()
{
// TODO: Add your control notification handler code here
CWaitCursor wait; // 等待光标
_xlsApplication objApp;
_xlsWorkbook objBook;
xlsWorkbooks objBooks;
xlsWorksheets objSheets;
_xlsWorksheet objSheet;
xlsRange objRange;
xlsFont objFont;
if(!objApp.CreateDispatch("Excel.Application"))
{
AfxMessageBox("failed");
return ;
}
VARIANT varOptional;
// 可选参数的使用方法应该如下:
VariantInit(&varOptional);
varOptional.vt=VT_ERROR;
varOptional.scode =DISP_E_PARAMNOTFOUND;
objBooks = objApp.GetWorkbooks();
objBook = objBooks.Add(varOptional);
objSheets = objBook.GetWorksheets();
objSheet = objSheets.Add(varOptional, varOptional, varOptional, varOptional);
long nRows, nCols;
nCols = g_pAdoServer->FieldCount;
nRows = g_pAdoServer->RecordCount + 1;
//////////////////指定单元格的列宽//////////////////////////////
long nSize;
long nstrLen;
string strFld;
VARIANT varCol;
// 可选参数的使用方法应该如下:
VariantInit(&varCol);
varCol.vt = VT_R4;
//Columns objCols;
//objCols = objSheet.GetColumns();
char cCol = 'A';
string strTempCol = "1";
string strCol;
for(long i = 0; i < nCols; i ++)
{
nSize = g_pAdoServer->FieldDefSize[i];
strFld = (_bstr_t)g_pAdoServer->FieldName[i];
nstrLen = strFld.length();
cCol = cCol + i;
strCol = cCol;
strCol = strCol + strTempCol;
// COleVariant(strCol.c_str())
objRange = objSheet.GetRange(COleVariant(strCol.c_str()), varOptional);
if(nstrLen < nSize)
{
varCol.fltVal = nSize +6;
objRange.SetColumnWidth(varCol);
}
else
{
varCol.fltVal = nstrLen +6;
objRange.SetColumnWidth(varCol);
}
}
////////////////////////////////////////////////////////////////
///////////////////用来获取单元格区间的一个过程/////////////////
char chr;
chr = 'A' + nCols -1;
string strChr;
string strTemp;
CString cstrTemp;
cstrTemp.Format("%d", 2);
strChr = chr;
strTemp = cstrTemp;
strChr = strChr + strTemp;
///////////////////////////////////////////////////////////////
VARIANT varUnit;
VariantInit(&varUnit);
varUnit.vt = VT_I4;
varUnit.lVal = 15;
objRange = objSheet.GetRange(COleVariant("A1"),
COleVariant(strChr.c_str()) );
objRange.Merge(varOptional); // 合并单元格
objFont = objRange.GetFont();
objFont.SetName(COleVariant("黑体"));
objFont.SetSize(varUnit);
objRange.SetValue2(COleVariant(LPCSTR(m_strTitle)));
varUnit.lVal = -4108;
objRange.SetHorizontalAlignment(varUnit); // xlCenter
objRange.SetVerticalAlignment(varUnit); // xlCenter
// 开始将数据库中的内容写入到安全数组
// 创建SAFEARRAY.
COleSafeArray saRet;
DWORD numElements[2];
numElements[0]= nRows; // 在objRange中的行数.
numElements[1]= nCols; // 在objRange中的列数.
saRet.Create(VT_BSTR, 2, numElements);
// 填充 SAFEARRAY.
long index[2];
long iRow;
long iCol;
string strValue;
CString strVal;
VARIANT varVal; // 该变量用来为安全数组赋值
g_pAdoServer->First();
for(iRow=0; iRow <= nRows-1; iRow++)
{
for(iCol=0; iCol <= nCols-1; iCol++)
{
index[0] = iRow;
index[1] = iCol;
if(0 == iRow)
{
strValue = g_pAdoServer->FieldName[iCol];
strVal = strValue.c_str();
VariantInit(&varVal);
varVal.vt = VT_BSTR;
varVal.bstrVal = strVal.AllocSysString();
saRet.PutElement(index, varVal.bstrVal);
SysFreeString(varVal.bstrVal);
VariantClear(&varVal);
}
else
{
strValue = (_bstr_t)g_pAdoServer->Field[iCol];
strVal = strValue.c_str();
strVal.TrimLeft();
strVal.TrimRight();
VariantInit(&varVal);
varVal.vt = VT_BSTR;
varVal.bstrVal = strVal.AllocSysString();
saRet.PutElement(index, varVal.bstrVal);
SysFreeString(varVal.bstrVal);
VariantClear(&varVal);
}
}
if(iRow > 0)
{
g_pAdoServer->Next();
}
}
///////////////////用来获取单元格区间的一个过程/////////////////
cstrTemp.Format("%d", nRows+2);
strChr = chr;
strTemp = cstrTemp;
strChr = strChr + strTemp;
///////////////////////////////////////////////////////////////
////////////将安全数组中的内容直接赋值给单元格////////////////
objRange = objSheet.GetRange(COleVariant("A3"),
COleVariant(strChr.c_str()) );
objFont = objRange.GetFont();
objFont.SetName(COleVariant("宋体"));
varUnit.lVal = 12;
objFont.SetSize(varUnit);
objRange.SetValue2(COleVariant(saRet));
varUnit.lVal = -4108;
objRange.SetHorizontalAlignment(varUnit); // xlCenter
objRange.SetVerticalAlignment(varUnit); // xlCenter
///////////////////////////////////////////////////////////////
objApp.SetVisible(true);
m_btnExcel.EnableWindow(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -