⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commprintdlg.cpp

📁 客户端服务器源码
💻 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 + -