c++ 读写Word

#pragma once
#include "msword/CApplication.h" //word程序对象   
#include "msword/CDocuments0.h" //文档集对象   
#include "msword/CDocument1.h" //docx对象   
#include "msword/CSelection0.h" //所选内容   
#include "msword/CCell0.h" //单个单元格   
#include "msword/CCells0.h" //单元格集合   
#include "msword/CRange0.h" //文档中的一个连续范围   
#include "msword/CTable1.h" //单个表格   
#include "msword/CTables1.h" //表格集合   
#include "msword/CRow0.h" //单个行   
#include "msword/CRows0.h" //行集合   
#include "msword/CBookmark0.h" //   
#include "msword/CBookmarks0.h" //
#include "msword/CFont0.h"
#include "msword/CnlineShape.h"
#include "msword/CnlineShapes.h"

const  auto wdMove = 0;
const  auto wdExtend = 1;
const  auto wdCharacter = 1;
const  auto wdLine = 5;
const  auto wdCell = 12;
const  auto wdDeleteCellsEntireRow = 2;

class WordOperate
{
public:
	WordOperate(void);
	~WordOperate(void);
	//创建一个新的WORD应用程序
	BOOL CreateApp();

	//创建一个新的Word文档集合 
	BOOL CreateDocuments();

	//创建一个新的Word文档
	BOOL CreateDocument();

	//创建新的WORD应用程序并创建一个新的文档
	BOOL Create();

	//显示WORD文档
	void ShowApp();

	//隐藏word文档
	void HideApp();

	//打开已经存在的文档。
	BOOL OpenDocument(const CString& fileName);

	//创建新的WORD应用程序并打开一个已经存在的文档。
	BOOL Open(CString fileName);

	//设置当前激活的文档。
	BOOL SetActiveDocument(short i);

	//文档是以打开形式,保存。
	BOOL SaveDocument();

	//文档以创建形式,保存。
	BOOL SaveDocumentAs(const CString& fileName);

	BOOL CloseDocument();
	void CloseApp();

	void WriteText(CString szText);        //当前光标处写文本  
	void WriteNewLineText(CString szText, int nLineCount = 1); //换N行写字  
	void WriteEndLine(CString szText);    //文档结尾处写文本  
	void WholeStory();                    //全选文档内容  
	void Copy();                        //复制文本内容到剪贴板  
	void InsertFile(CString fileName);    //将本地的文件全部内容写入到当前文档的光标处。

	void SelectMoveDown(short lineCount, short unit);//有选择操作的移动  
	void NoneSelectMoveDown(short lineCount, short unit);//仅仅移动光标,不选中  
	void SelectMoveUp(short lineCount, short unit);//有选择操作的移动  
	void NoneSelectMoveUp(short lineCount, short unit);//仅仅移动光标,不选中  

	void SelectMoveLeft(short charCount, short unit);//有选择操作的移动  
	void NoneSelectMoveLeft(short charCount, short unit);//  
	void SelectMoveRight(short charCount, short unit);//有选择操作的移动  
	void NoneSelectMoveRight(short charCount, short unit);//  

	void MoveToFirst();
	void MoveToNextPage();
	void TypeParagraph();
	void PasteAndFormat();
	void Paste();
	void TypeBackspace(int count);
	//填写书签
	void SetCBookmark(const CString& bookmarkname, const CString& value, const CString& fontname = "");
	//设置单元格内容
	void SetWordCellValue(int row, int column, int tableIndex, const CString& value, float size, const CString& fontname = "");
	//合并单元格
	BOOL MergeCell(int  cell1row, int cell1col, int cell2row, int cell2col, int tableIndex);
	//查找字符串 然后全部替换
	void FindWord(CString FindW, CString RelWord);
	//表格插入行
	void TableInsertRows(int row, int column, int tableIndex);
	//表格删除行
	void TableRemoveRows(int row, int column, int tableIndex);
	//插入照片
	void InsertJpg(CString strPicture);
private:
	CApplication m_wdApp;
	CDocuments0 m_wdDocs;
	CDocument1 m_wdDoc;
	CSelection0 m_wdSel;
	CRange0     m_wdRange;
	CBookmarks0 bookmarks;
	CTables1 tables;
};

#include "stdafx.h"
#include "WordOperate.h"

WordOperate::WordOperate(void)
{
}


WordOperate::~WordOperate(void)
{
	COleVariant vTrue((short)TRUE),
		vFalse((short)FALSE),
		vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	//m_wdDoc.Save();
	m_wdApp.Quit(vFalse,    // SaveChanges.
		vTrue,            // OriginalFormat.
		vFalse            // RouteDocument.
	);
	m_wdRange.ReleaseDispatch();
	m_wdSel.ReleaseDispatch();
	//m_wdFt.ReleaseDispatch();
	m_wdDoc.ReleaseDispatch();
	m_wdDocs.ReleaseDispatch();
	m_wdApp.ReleaseDispatch();
}

BOOL WordOperate::CreateApp()
{
	COleException pe;
	if (!m_wdApp.CreateDispatch(_T("Word.Application"), &pe))
	{
		AfxMessageBox(_T("Application创建失败,请确保安装了word 2000或以上版本!"), MB_OK | MB_ICONWARNING);
		pe.ReportError();
		throw& pe;
		return FALSE;
	}
	m_wdApp.put_DisplayAlerts(FALSE);//屏蔽警告
	return TRUE;
}

BOOL WordOperate::CreateDocuments()
{
	if (FALSE == CreateApp())
	{
		return FALSE;
	}
	m_wdDocs.AttachDispatch(m_wdApp.get_Documents());
	//m_wdDocs=m_wdApp.get_Documents();
	if (!m_wdDocs.m_lpDispatch)
	{
		AfxMessageBox(_T("Documents创建失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}	
	return TRUE;
}

BOOL WordOperate::CreateDocument()
{
	if (!m_wdDocs.m_lpDispatch)
	{
		AfxMessageBox(_T("Documents为空!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}

	COleVariant varTrue(short(1), VT_BOOL), vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	CComVariant Template(_T(""));    //没有使用WORD的文档模板  
	CComVariant NewTemplate(false), DocumentType(0), Visible;

	m_wdDocs.Add(&Template, &NewTemplate, &DocumentType, &Visible);

	//得到document变量  
	m_wdDoc = m_wdApp.get_ActiveDocument();
	if (!m_wdDoc.m_lpDispatch)
	{
		AfxMessageBox(_T("Document获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	//得到selection变量  
	m_wdSel = m_wdApp.get_Selection();
	if (!m_wdSel.m_lpDispatch)
	{
		AfxMessageBox(_T("Select获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	//得到Range变量  
	m_wdRange = m_wdDoc.Range(vOptional, vOptional);
	if (!m_wdRange.m_lpDispatch)
	{
		AfxMessageBox(_T("Range获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}

	return TRUE;
}

BOOL WordOperate::Create()
{
	/*if (FALSE == CreateDocuments())
	{
		return FALSE;
	}*/
	return CreateDocument();
}

void WordOperate::ShowApp()
{
	m_wdApp.put_Visible(TRUE);
}

void WordOperate::HideApp()
{
	m_wdApp.put_Visible(FALSE);
}

BOOL WordOperate::OpenDocument(const CString& fileName)
{
	if (!m_wdDocs.m_lpDispatch)
	{
		AfxMessageBox(_T("Documents为空!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}

	COleVariant vTrue((short)TRUE),
		vFalse((short)FALSE),
		vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR),
		vZ((short)0);
	COleVariant vFileName(fileName);

	//得到document变量  
	try
	{
		//m_wdDoc = m_wdDocs.Add(vFileName, vOptional, vOptional, vOptional);		
		m_wdDoc.AttachDispatch(m_wdDocs.Open(
		vFileName,        // FileName  
		vTrue,            // Confirm Conversion.  
		vFalse,            // ReadOnly.  
		vFalse,            // AddToRecentFiles.  
		vOptional,        // PasswordDocument.  
		vOptional,        // PasswordTemplate.  
		vOptional,        // Revert.  
		vOptional,        // WritePasswordDocument.  
		vOptional,        // WritePasswordTemplate.  
		vOptional,        // Format. // Last argument for Word 97  
		vOptional,        // Encoding // New for Word 2000/2002  
		vOptional,        // Visible  
		//如下4个是word2003需要的参数。本版本是word2000。  
		vOptional,    // OpenAndRepair  
		vZ,            // DocumentDirection wdDocumentDirection LeftToRight  
		vOptional,    // NoEncodingDialog  
		vOptional

	)                // Close Open parameters  
	);                    // Close AttachDispatch 
	}
	catch (const std::exception&p)
	{
		CString str= p.what();
		AfxMessageBox(str, MB_OK | MB_ICONWARNING);
		return FALSE;
	}

	

	if (!m_wdDoc.m_lpDispatch)
	{
		AfxMessageBox(_T("Document获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	//得到selection变量  
	m_wdSel = m_wdApp.get_Selection();
	if (!m_wdSel.m_lpDispatch)
	{
		AfxMessageBox(_T("Select获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	//得到全部DOC的Range变量  
	m_wdRange = m_wdDoc.Range(vOptional, vOptional);
	if (!m_wdRange.m_lpDispatch)
	{
		AfxMessageBox(_T("Range获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	//得到全部书签
	bookmarks = m_wdDoc.get_Bookmarks();
	if (!bookmarks.m_lpDispatch)
	{
		AfxMessageBox(_T("bookmarks获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	//得到全部表格
	tables = m_wdDoc.get_Tables();
	if (!tables.m_lpDispatch)
	{
		AfxMessageBox(_T("tables获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	return TRUE;
}

BOOL WordOperate::Open(CString fileName)
{
	if (FALSE == CreateDocuments())
	{
		return FALSE;
	}
	//HideApp();  
	return OpenDocument(fileName);
}

BOOL WordOperate::SetActiveDocument(short i)
{
	COleVariant     vIndex(i), vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

	m_wdDoc.AttachDispatch(m_wdDocs.Item(vIndex));
	m_wdDoc.Activate();
	if (!m_wdDoc.m_lpDispatch)
	{
		AfxMessageBox(_T("Document获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	//得到selection变量  
	m_wdSel = m_wdApp.get_Selection();
	if (!m_wdSel.m_lpDispatch)
	{
		AfxMessageBox(_T("Select获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	//得到全部DOC的Range变量  
	m_wdRange = m_wdDoc.Range(vOptional, vOptional);
	if (!m_wdRange.m_lpDispatch)
	{
		AfxMessageBox(_T("Range获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	//得到全部书签
	bookmarks = m_wdDoc.get_Bookmarks();
	if (!bookmarks.m_lpDispatch)
	{
		AfxMessageBox(_T("bookmarks获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	HideApp();
	return TRUE;
}

BOOL WordOperate::SaveDocument()
{
	if (!m_wdDoc.m_lpDispatch)
	{
		AfxMessageBox(_T("Document获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	m_wdDoc.Save();
	return TRUE;
}

BOOL WordOperate::SaveDocumentAs(const CString& fileName)
{
	if (!m_wdDoc.m_lpDispatch)
	{
		AfxMessageBox(_T("Document获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	COleVariant vTrue((short)TRUE),
		vFalse((short)FALSE),
		vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	COleVariant vFileName(fileName);

	m_wdDoc.SaveAs(
		vFileName,    //VARIANT* FileName  
		vOptional,    //VARIANT* FileFormat  
		vOptional,    //VARIANT* LockComments  
		vOptional,    //VARIANT* Password  
		vOptional,    //VARIANT* AddToRecentFiles  
		vOptional,    //VARIANT* WritePassword  
		vOptional,    //VARIANT* ReadOnlyRecommended  
		vOptional,    //VARIANT* EmbedTrueTypeFonts  
		vOptional,    //VARIANT* SaveNativePictureFormat  
		vOptional,    //VARIANT* SaveFormsData  
		vOptional,    //VARIANT* SaveAsAOCELetter  
		vOptional,    //VARIANT* ReadOnlyRecommended  
		vOptional,    //VARIANT* EmbedTrueTypeFonts  
		vOptional,    //VARIANT* SaveNativePictureFormat  
		vOptional,    //VARIANT* SaveFormsData  
		vOptional    //VARIANT* SaveAsAOCELetter  
	);
	return    TRUE;
}


BOOL WordOperate::CloseDocument()
{
	COleVariant vTrue((short)TRUE),
		vFalse((short)FALSE),
		vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

	m_wdDoc.Close(vFalse,    // SaveChanges.  
		vTrue,            // OriginalFormat.  
		vFalse            // RouteDocument.  
	);
	/*
	//AfxMessageBox("c1");
	m_wdDoc.AttachDispatch(m_wdApp.get_ActiveDocument());
	if (!m_wdDoc.m_lpDispatch)
	{
		AfxMessageBox(_T("Document获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	//  AfxMessageBox("c2");
		//得到selection变量
	m_wdSel = m_wdApp.get_Selection();
	if (!m_wdSel.m_lpDispatch)
	{
		AfxMessageBox(_T("Select获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	//  AfxMessageBox("c3");
		//得到全部DOC的Range变量
	m_wdRange = m_wdDoc.Range(vOptional, vOptional);
	if (!m_wdRange.m_lpDispatch)
	{
		AfxMessageBox(_T("Range获取失败!"), MB_OK | MB_ICONWARNING);
		return FALSE;
	}
	//  AfxMessageBox("c4");
	*/
	m_wdRange.ReleaseDispatch();
	m_wdRange = nullptr;
	m_wdSel.ReleaseDispatch();
	m_wdSel = nullptr;
	bookmarks.ReleaseDispatch();
	bookmarks = nullptr;
	tables.ReleaseDispatch();
	tables = nullptr;
	m_wdDoc.ReleaseDispatch();
	m_wdDoc = nullptr;
	return TRUE;
}

void WordOperate::CloseApp()
{
	COleVariant vTrue((short)TRUE),
		vFalse((short)FALSE),
		vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	//m_wdDoc.Save();
	m_wdApp.Quit(vFalse,    // SaveChanges.  
		vTrue,            // OriginalFormat.  
		vFalse            // RouteDocument.  
	);
	//释放内存申请资源  
	bookmarks.ReleaseDispatch();
	m_wdRange.ReleaseDispatch();

	m_wdSel.ReleaseDispatch();
	tables.ReleaseDispatch();
	m_wdDoc.ReleaseDispatch();
	m_wdDocs.ReleaseDispatch();
	m_wdApp.ReleaseDispatch();
}

void WordOperate::WriteText(CString szText)
{
	m_wdSel.TypeText(szText);
}

void WordOperate::WriteNewLineText(CString szText, int nLineCount /**//* = 1 */)
{
	int i;
	if (nLineCount <= 0)
	{
		nLineCount = 0;
	}
	for (i = 0; i < nLineCount; i++)
	{
		m_wdSel.TypeParagraph();
	}
	WriteText(szText);
}

void WordOperate::WriteEndLine(CString szText)
{
	m_wdRange.InsertAfter(szText);
}

void WordOperate::WholeStory()
{
	m_wdRange.WholeStory();
}

void WordOperate::Copy()
{
	m_wdSel.Copy();
	//m_wdSel.CopyFormat();  
}

void WordOperate::TypeParagraph()
{
	m_wdSel.TypeParagraph();
}

void WordOperate::PasteAndFormat()
{
	m_wdSel.PasteAndFormat(0);
}

void WordOperate::Paste()
{
	m_wdSel.Paste();
	//m_wdSel.PasteFormat();  
}

void WordOperate::TypeBackspace(int count)
{
	for (int i = 0; i < count; i++)
		m_wdSel.TypeBackspace();
}
void WordOperate::SetCBookmark(const CString& bookmarkname, const CString& value, const CString& fontname)
{
	if (bookmarks.Exists(bookmarkname))
	{
		CBookmark0 bookmark = bookmarks.Item(&_variant_t(bookmarkname));
		if (bookmark != nullptr)
		{
			CRange0 range = bookmark.get_Range();
			range.put_Text(value);
			if (fontname != "")
			{
				CFont0 font = range.get_Font();
				font.put_Name(fontname);//设置字体
				font.ReleaseDispatch();
			}
			range.ReleaseDispatch();
			range = nullptr;
			bookmark.ReleaseDispatch();
			bookmark = nullptr;
		}
	}
}
void WordOperate::SetWordCellValue(int row, int column, int tableIndex, const CString& value, float size, const CString& fontname)
{
	CTable1 table = tables.Item(tableIndex);
	CCell0 c1 = table.Cell(row, column);
	c1.Select();
	//m_wdSel = m_wdApp.get_Selection();//Selection表示输入点,即光标闪烁的那个地方
	m_wdSel.TypeText(value);
	CFont0 font = m_wdSel.get_Font();
	if (fontname != "")
	{
		font.put_Name(fontname);//设置字体
	}
	font.put_Size(size);

	//aa.Add(covOptional);
	//COleVariant vNull(_T(""));
	//aa.Add(vNull);
	//CRow0 row0= c1.get_Row();	
	//CRange0 range=c1.get_Range();	
	//range.put_Text(value);
	//CFont0  font = range.get_Font();
	//font.put_Name(_T("宋体"));//设置字体
	//font.put_Size(14);

	//range.ReleaseDispatch();
	font.ReleaseDispatch();
	c1.ReleaseDispatch();
	table.ReleaseDispatch();
}
BOOL WordOperate::MergeCell(int cell1row, int cell1col, int cell2row, int cell2col, int tableIndex)
{
	CTable1 table = tables.Item(tableIndex);
	CCell0 cell1 = table.Cell(cell1row, cell1col);
	CCell0 cell2 = table.Cell(cell2row, cell2col);
	cell1.Merge(cell2);
	cell1.ReleaseDispatch();
	cell2.ReleaseDispatch();
	table.ReleaseDispatch();
	return TRUE;
}
void WordOperate::FindWord(CString FindW, CString RelWord)
{
}
void WordOperate::TableInsertRows(int row, int column, int tableIndex)
{
	CTable1 table = tables.Item(tableIndex);
	CCell0 c1 = table.Cell(row, column);
	c1.Select();
	COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	m_wdSel.InsertRows(covOptional);

	c1.ReleaseDispatch();
	table.ReleaseDispatch();
}
void WordOperate::TableRemoveRows(int row, int column, int tableIndex)
{
	CTable1 table = tables.Item(tableIndex);
	CCell0 c1 = table.Cell(row, column);
	c1.Select();
	c1.Delete(COleVariant((long)wdDeleteCellsEntireRow));
	c1.ReleaseDispatch();
	table.ReleaseDispatch();
}
void WordOperate::InsertJpg(CString strPicture)
{
	COleVariant   covTrue((short)TRUE),
		covFalse((short)FALSE),
		covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

	CnlineShapes nLineShapes1 = m_wdSel.get_InlineShapes();

	CnlineShape nLineshape1 = nLineShapes1.AddPicture(strPicture, covFalse, covTrue, covOptional);// LinkToFile False 使图片文件的独立副本
	//auto old= nLineshape1.get_LockAspectRatio();
	nLineshape1.put_LockAspectRatio(1);//锁定纵横比
	//一页一张
	//auto width = nLineshape1.get_Width();
	//auto height = nLineshape1.get_Height();
	auto a = nLineshape1.get_ScaleWidth();
	auto b=nLineshape1.get_ScaleHeight();
	//nLineshape1.put_Width(206.5*2);
	//auto c = 206.5*2 / (width / height);
	//nLineshape1.put_Height(c);

	nLineshape1.ReleaseDispatch();
	nLineShapes1.ReleaseDispatch();
}
void WordOperate::InsertFile(CString fileName)
{
	COleVariant     vFileName(fileName),
		vTrue((short)TRUE),
		vFalse((short)FALSE),
		vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR),
		vNull(_T(""));
	/**//*
		void InsertFile(LPCTSTR FileName, VARIANT* Range, VARIANT* ConfirmConversions, VARIANT* Link, VARIANT* Attachment);
		*/
	m_wdSel.InsertFile(
		fileName,
		vNull,
		vFalse,
		vFalse,
		vFalse
	);
}

void WordOperate::SelectMoveDown(short lineCount, short unit)//有选择操作的移动
{
	m_wdSel.MoveDown(COleVariant(unit), COleVariant((short)lineCount), COleVariant((short)wdExtend));
}

void WordOperate::NoneSelectMoveDown(short lineCount, short unit)//仅仅移动光标,不选中
{
	m_wdSel.MoveDown(COleVariant(unit), COleVariant((short)lineCount), COleVariant((short)wdMove));
}

void WordOperate::SelectMoveUp(short lineCount, short unit)//有选择操作的移动
{
	m_wdSel.MoveUp(COleVariant(unit), COleVariant((short)lineCount), COleVariant((short)wdExtend));
}

void WordOperate::NoneSelectMoveUp(short lineCount, short unit)//仅仅移动光标,不选中
{
	m_wdSel.MoveUp(COleVariant(unit), COleVariant((short)lineCount), COleVariant((short)wdMove));
}

void WordOperate::SelectMoveLeft(short charCount, short unit)//有选择操作的移动
{
	m_wdSel.MoveLeft(COleVariant(unit), COleVariant((short)charCount), COleVariant((short)wdExtend));
}

void WordOperate::NoneSelectMoveLeft(short charCount, short unit)//
{
	m_wdSel.MoveLeft(COleVariant(unit), COleVariant((short)charCount), COleVariant((short)wdMove));
}
void WordOperate::SelectMoveRight(short charCount, short unit)//有选择操作的移动
{
	m_wdSel.MoveRight(COleVariant(unit), COleVariant((short)charCount), COleVariant((short)wdExtend));
}
void WordOperate::NoneSelectMoveRight(short charCount, short unit)//
{
	m_wdSel.MoveRight(COleVariant(unit), COleVariant((short)charCount), COleVariant((short)wdMove));
}
void WordOperate::MoveToFirst()
{
	m_wdSel.GoTo(COleVariant((short)1), COleVariant((short)2), COleVariant((short)0), COleVariant((short)1));
}

void WordOperate::MoveToNextPage()
{
	m_wdSel.GoTo(COleVariant((short)1), COleVariant((short)2), COleVariant((short)1), COleVariant());
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值