asp.net从数据库导出数据到word、excel、txt文本文件

怎样在asp.net生成txt文件写入数据并下载到本地? 怎么在asp.net生成txt文件,并且下载到本地,不在Web端 你可以在服务的生成临时文件,生成链接,然后在客户端下载 C#生成txt文件,并将数据写入进去 C#中将数据写入txt文本文件中 Response.Clear(); Response.Buffer=false; Response.ContentType="application/octet-stream"; Res... 阅读详情

using System; 
using System.Data; 
using System.Drawing; 
using System.Data.SqlClient; 
using Excel; 
using Word; 
using System.IO; 
namespace Common 
{ 
/// <summary> 
/// 把数据导入到.doc、.txt、.xls文件中 
/// </summary> 
public class Export 
{ 
private const string DATAWORDPATH = @"C:/folder/doc/datadoc/"; 
private const string IMAGEWORDPATH = @"C:/folder/doc/imagedoc/"; 
private const string IMAGEPATH = @"C:/folder/image/"; 
private const string EXCELPATH = @"C:/folder/excel/"; 
private const string TXTPATH = @"C:/folder/txt/"; 
private const string IMAGEPOSTFIX = ".bmp"; 
private const string WORDPOSTFIX = ".doc"; 
private const string EXCELPOSTFIX = ".xls"; 
private const string TXTPOSTFIX = ".txt"; 
private const int DATADISTANCE = 5; 
private const int TABDISTANCE = 8; 

public Export() 
{ 
// 
// TODO: 在此处添加构造函数逻辑 
// 
} 
/// <summary> 
/// 获得数据集Dataset--------------------------------用于调试 
/// </summary> 
/// <returns>Dataset</returns> 
public DataSet GetData() 
{ 
try 
{ 
string sConnectionString; 
sConnectionString = "workstation id=GUOFU;packet size=4096;user id=sa;data source=GUOFU;persist security info=True;initial catalog=YC;password=sc"; 
SqlConnection objConn = new SqlConnection(sConnectionString); 
objConn.Open(); 
SqlDataAdapter daPoint = new SqlDataAdapter("Select * From Point", objConn); 
DataSet dsYC = new DataSet("YC"); 
daPoint.FillSchema(dsYC,SchemaType.Mapped, "Point"); 
daPoint.Fill(dsYC,"Point"); 
daPoint = new SqlDataAdapter("Select * From Employee", objConn); 
daPoint.FillSchema(dsYC,SchemaType.Mapped, "Employee"); 
daPoint.Fill(dsYC,"Employee"); 
return dsYC; 
} 
catch(Exception ex) 
{ 
throw new Exception(ex.Message); 
} 

} 

/// <summary> 
/// 把数据文件导入到.xls文件 
/// </summary> 
/// <param name="ds"></param> 
public void ExportToExcel(DataSet ds) 
{ 

if(ds.Tables.Count!=0) 
{ 
//生成.xls文件完整路径名 
string tempFileName = GetTempFileName(); 
object filename = EXCELPATH+tempFileName+EXCELPOSTFIX; 
object Nothing = System.Reflection.Missing.Value; 

//创建excel文件,文件名用系统时间生成精确到毫秒 
Excel.Application myExcel = new Excel.ApplicationClass(); 
myExcel.Application.Workbooks.Add(Nothing); 

try 
{ 
//把Dataset中的数据插入excel文件中 
int totalCount = 0; 
for(int k =0;k<ds.Tables.Count;k++) 
{ 
int row = ds.Tables[k].Rows.Count; 
int column = ds.Tables[k].Columns.Count; 

for(int i = 0;i<column;i++) 
{ 
myExcel.Cells[totalCount+2,1+i] = ds.Tables[k].Columns[i].ColumnName; 
} 

for(int i = 0;i<row;i++) 
{ 
for(int j =0;j<column;j++) 
{ 
myExcel.Cells[totalCount+3+i,1+j] = "'" + ds.Tables[k].Rows[i][j].ToString(); 
} 
} 
totalCount = totalCount + row +4; 
} 

try 
{ 
//保存excel文件到指定的目录下,文件名用系统时间生成精确到毫秒 
myExcel.ActiveWorkbook._SaveAs(filename,Nothing,Nothing,Nothing,Nothing,Nothing,XlSaveAsAccessMode.xlExclusive,Nothing,Nothing,Nothing,Nothing); 
} 
catch 
{ 
System.Windows.Forms.MessageBox.Show("系统找不到指定目录下的文件: "+EXCELPATH+tempFileName+EXCELPOSTFIX); 
return; 
} 
//让生成的excel文件可见 
myExcel.Visible = true; 
} 
catch(Exception e) 
{ 
System.Windows.Forms.MessageBox.Show("向excel文件中写入数据出错: " + e.Message); 
} 
} 
else 
{ 
System.Windows.Forms.MessageBox.Show("No Data"); 
} 
} 


/// <summary> 
/// 把数据导入到.doc文件 
/// </summary> 
/// <param name="ds"></param> 
public void ExportToWord(DataSet ds) 
{ 
if(ds.Tables.Count!=0) 
{ 
string tempFileName = null; 
object filename = null; 

object tableBehavior = Word.WdDefaultTableBehavior.wdWord9TableBehavior; 
object autoFitBehavior = Word.WdAutoFitBehavior.wdAutoFitFixed; 

object unit = Word.WdUnits.wdStory; 
object extend = System.Reflection.Missing.Value; 
object breakType = (int)Word.WdBreakType.wdSectionBreakNextPage; 

object count = 1; 
object character = Word.WdUnits.wdCharacter; 

object Nothing = System.Reflection.Missing.Value; 

try 
{ 
tempFileName = GetTempFileName(); 

//生成.doc文件完整路径名 
filename = DATAWORDPATH+tempFileName+WORDPOSTFIX; 

//创建一个word文件,文件名用系统时间生成精确到毫秒 
Word.Application myWord= new Word.ApplicationClass(); 
Word._Document myDoc = new Word.DocumentClass(); 
myDoc = myWord.Documents.Add(ref Nothing,ref Nothing,ref Nothing,ref Nothing); 
myDoc.Activate(); 

//向把dataset中的表插入到word的文件中 

for(int totalTable = 0;totalTable<ds.Tables.Count;totalTable++) 
{ 
myWord.Application.Selection.TypeText(ds.Tables[totalTable].TableName+"表的数据如下"); 
myWord.Application.Selection.TypeParagraph(); 
myWord.Application.Selection.TypeParagraph(); 
Word.Range para = myWord.Application.Selection.Range; 
myDoc.Tables.Add(para,ds.Tables[totalTable].Rows.Count+1,ds.Tables[totalTable].Columns.Count,ref tableBehavior,ref autoFitBehavior); 
for(int column = 0; column<ds.Tables[totalTable].Columns.Count;column++) 
{ 
myDoc.Tables.Item(totalTable+1).Cell(1,column+1).Range.InsertBefore(ds.Tables[0].Columns[column].ColumnName.Trim()); 
} 
for(int row = 0;row<ds.Tables[totalTable].Rows.Count;row++) 
{ 
for(int column = 0;column<ds.Tables[totalTable].Columns.Count;column++) 
{ 
myDoc.Tables.Item(totalTable+1).Cell(row+2,column+1).Range.InsertBefore(ds.Tables[totalTable].Rows[row][column].ToString().Trim()); 
} 
} 
myWord.Application.Selection.EndKey(ref unit,ref extend); 
myWord.Application.Selection.TypeParagraph(); 
myWord.Application.Selection.TypeParagraph(); 
myWord.Application.Selection.InsertBreak(ref breakType); 
} 
myWord.Application.Selection.TypeBackspace(); 
myWord.Application.Selection.Delete(ref character,ref count); 
myWord.Application.Selection.HomeKey(ref unit,ref extend); 

//保存word文件到指定的目录下 
try 
{ 
myDoc.SaveAs(ref filename,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing); 
myWord.Visible = true; 
} 
catch 
{ 
System.Windows.Forms.MessageBox.Show("系统找不到指定目录下的文件: "+DATAWORDPATH+tempFileName+WORDPOSTFIX); 
return; 
} 
//让生成的excel文件可见 
myWord.Visible = true; 
} 
catch(Exception ex) 
{ 
System.Windows.Forms.MessageBox.Show("向word文件中写入数据出错: " + ex.Message); 
} 
} 
else 
{ 
System.Windows.Forms.MessageBox.Show("No Data"); 
} 
} 
/// <summary> 
/// 把图片文件导入到.doc文件 
/// </summary> 
/// <param name="bp"></param> 
public void ExportToWord(Bitmap bp) 
{ 
string tempFileName = null; 
string bmpPath = null; 
object filename = null; 
object Nothing = null; 
tempFileName = GetTempFileName(); 


//生成.bmp文件完整路径名 
bmpPath = IMAGEPATH+tempFileName+IMAGEPOSTFIX; 

//生成.doc文件完整路径名 
filename = IMAGEWORDPATH+tempFileName+WORDPOSTFIX; 
Nothing = System.Reflection.Missing.Value; 

//创建一个word文件,文件名用系统时间生成精确到毫秒 
Word.Application myWord= new Word.ApplicationClass(); 
Word._Document myDoc = new Word.DocumentClass(); 
myDoc = myWord.Documents.Add(ref Nothing,ref Nothing,ref Nothing,ref Nothing); 

try 
{ 
//把bitmap对象保存到系统所生成文件完整路径中 
bp.Save(bmpPath); 
} 
catch 
{ 
System.Windows.Forms.MessageBox.Show("系统找不到指定目录下的文件: "+bmpPath); 
return; 
} 

try 
{ 
//往word文件中插入图片 
myDoc.InlineShapes.AddPicture(bmpPath,ref Nothing,ref Nothing,ref Nothing); 
} 
catch 
{ 
System.Windows.Forms.MessageBox.Show("系统找不到指定目录下的文件: "+bmpPath); 
return; 
} 

try 
{ 
//保存word文件到指定的目录下 
myDoc.SaveAs(ref filename,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing); 
} 
catch 
{ 
System.Windows.Forms.MessageBox.Show("系统找不到指定目录下的文件: "+IMAGEWORDPATH+tempFileName+WORDPOSTFIX); 
return; 
} 
//让生成的word文件可见 
myWord.Visible = true; 
} 


/// <summary> 
/// 把数据文件导入到.txt文件 
/// </summary> 
/// <param name="ds"></param> 
public void ExportToTxt(DataSet ds) 
{ 

if(ds.Tables.Count!=0) 
{ 
string tempFileName = null; 
tempFileName = GetTempFileName(); 


//创建一个.txt文件,文件名用系统时间生成精确到毫秒 
FileInfo file = new FileInfo(TXTPATH+tempFileName+TXTPOSTFIX); 
StreamWriter textFile = null; 
try 
{ 
textFile = file.CreateText(); 
} 
catch 
{ 
System.Windows.Forms.MessageBox.Show("系统找不到指定目录下的文件: "+TXTPATH+tempFileName+TXTPOSTFIX); 
return; 
} 

//把Dataset中的数据写入.txt文件中 
for(int totaltable = 0;totaltable<ds.Tables.Count;totaltable++) 
{ 
//统计dataset中当前表的行数 
int row = ds.Tables[totaltable].Rows.Count; 

//统计dataset中当前表的列数 
int column = ds.Tables[totaltable].Columns.Count; 

//用于统计当前表中每列记录中字符数最长的字符串的长度之和 
int totalLength = 0; 

//用于统计标题的长度(dataset中的表名的length+"表的数据如下"的length) 
int titleLength = 0; 

//统计每列记录中字符数最长的字符串的长度 
int[] columnLength = new int[column]; 
for(int i = 0;i<column;i++) 
{ 
columnLength[i] = ds.Tables[totaltable].Columns[i].ColumnName.ToString().Length; 
} 
for(int i = 0;i<row;i++) 
{ 
for(int j = 0;j<column;j++) 
{ 
if(ds.Tables[totaltable].Rows[i][j].ToString().Length>columnLength[j]) 
{ 
columnLength[j]=ds.Tables[totaltable].Rows[i][j].ToString().Length; 
} 
} 
} 


//统计当前表中每列记录中字符数最长的字符串的长度之和 
for(int i = 0;i<column;i++) 
{ 
totalLength = totalLength+columnLength[i]+DATADISTANCE; 
} 
totalLength = totalLength+2*TABDISTANCE-DATADISTANCE; 

//统计标题的长度(dataset中的当前表名的length+"表的数据如下"的length) 
titleLength = ds.Tables[totaltable].TableName.ToString().Length+"表的数据如下".Length*2; 

//把标题写入.txt文件中 
for(int i = 0;i<(int)((totalLength-titleLength)/2);i++) 
{ 
textFile.Write(' '); 
} 
textFile.Write(ds.Tables[totaltable].TableName+"表的数据如下"); 
textFile.WriteLine(); 
for(int i = 0;i<totalLength;i++) 
{ 
textFile.Write('*'); 
} 
textFile.WriteLine(); 
textFile.Write("/t"); 
//把dataset中当前表的字段名写入.txt文件中 
for(int i = 0;i<column;i++) 
{ 
textFile.Write(ds.Tables[totaltable].Columns[i].ColumnName.ToString()); 
for(int k = 0;k<columnLength[i]-ds.Tables[totaltable].Columns[i].ColumnName.ToString().Length+DATADISTANCE;k++) 
{ 
textFile.Write(' '); 
} 
} 
textFile.WriteLine(); 
for(int i = 0;i<totalLength;i++) 
{ 
textFile.Write('-'); 
} 
textFile.WriteLine(); 
textFile.Write("/t"); 

//把dataset中当前表的数据写入.txt文件中 
for(int i = 0;i<row;i++) 
{ 
for(int j = 0;j<column;j++) 
{ 
textFile.Write(ds.Tables[totaltable].Rows[i][j].ToString()); 
for(int k = 0;k<columnLength[j]-ds.Tables[totaltable].Rows[i][j].ToString().Length+DATADISTANCE;k++) 
{ 
textFile.Write(' '); 
} 
} 
textFile.WriteLine(); 
textFile.Write("/t"); 
} 
textFile.WriteLine(); 
for(int i = 0;i<totalLength;i++) 
{ 
textFile.Write('-'); 
} 
textFile.WriteLine(); 
textFile.WriteLine(); 
textFile.WriteLine(); 
} 

//关闭当前的StreamWriter流 
textFile.Close(); 
System.Windows.Forms.MessageBox.Show("数据文件已保存到"+" "+file.FullName); 
} 
else 
{ 
System.Windows.Forms.MessageBox.Show("No Data"); 
} 
} 

public string GetTempFileName() 
{ 
return DateTime.Now.ToString("yyyyMMddhhmmssfff"); 
} 
} 
} 

补充:使用以上方法必须对dcom进行配置,给用户使用office的权限。 
具体配置方法如下: 
1:在服务器上安装office的Excel软件. 
2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务" 
3:依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置" 
4:在"DCOM配置"中找到"Microsoft Excel 应用程序",在它上面点击右键,然后点击"属性",弹出"Microsoft Excel 应用程序属性"对话框 
5:点击"标识"标签,选择"交互式用户" 
6:点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加一个"NETWORK SERVICE"用户(注意要选择本计算机名),并给它赋予"本地启动"和"本地激活"权限. 
7:依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",在弹出的"安全性"对话框中也填加一个"NETWORK SERVICE"用户,然后赋予"本地访问"权限. 
这样,我们便配置好了相应的Excel的DCOM权限. 
注意:我是在WIN2003上配置的,在2000上,是配置ASPNET用户 

若不进行配置会出现错误 
检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。 
原因是用户没有使用Excel的权限。 
导出到word同样要配置使用word的权限。 
继续补充: 导出到txt我用了上面的方法有问题, 
try 
{ 
textFile = file.CreateText(); 
} 
catch 
{ 
System.Windows.Forms.MessageBox.Show("系统找不到指定目录下的文件: "+TXTPATH+tempFileName+TXTPOSTFIX); 
return; 
} 
总是在这里跳到catch里面。导出到word,excel都能用,继续研究txt的使用方法。

在IE中利用ASP.NET展示多种文件类型 在深入探讨如何利用Office COM组件处理Word和Excel文件之前,有必要了解COM(Component Object Model)组件的基本概念。COM是一种由Microsoft定义的接口标准,用于软件组件之间进行交互。它允许不同的软件组件通过一套预先定义的接口进行通信,无需考虑它们是用什么语言编写的。在ASP.NET中,开发者可以利用Office COM组件来操作Office文档,实现复杂的办公自动化功能。 阅读详情

相关推荐

asp.net core 使用NLog打印日志到txt文件

asp.net core 使用NLog打印日志到txt文件。 每个txt文件支持设置最大值,如设置为1M,则每个日志超过1M,会生成新的日志文件; 日志支持显示所在位置以及行号;

.net core 操作file、txt、xml文件流

生成Zip代码: //Unit Test [Test] public void GenerationZip() { //文件生成目录 string folder = "Template"; //文件列表 IList<string> fileNames = new List<string>() {

a赟 3221

C# Txt文件导入导出

C# Txt文件导入导出 XmlHelper help_Xml = new XmlHelper(文件地址); 再调用方法就行了

asp.net导出txt文件

//通过repeater保存为txt文件 protected void btn3_Click(object sender, EventArgs e) { string sel = "select EX_Parent ,EX_PostCode ,EX_Address from EnterInfo where EX_Mark like '%" + txtMark3.Tex

MrWang 6551

ASP中生成文本文件的两种方式

ASP里两种常用的生成文件的方式是:利用ADODB.Stream生成文件和利用Scripting.FileSystemObject生成文件 1、Scripting.FileSystemObject生成文件方法:  代码如下:<%  Set fso = CreateObject(“Scripting.FileSystemObject”)  File=Server.MapPath(“要生成文件路径和文件名.htm”)  Set txt=fso.OpenTextFile(File,8,True)   data1=”文件内容”用WriteLine方法生成文件  txt.WriteLine data1 

新手必看:Infineon Memtools烧录配置全流程(附常见错误解决方案)

本文为嵌入式开发新手提供了Infineon AURIX开发环境搭建与Memtools烧录的全流程实战指南。详细解析了ADS、DAS和Memtools三大核心工具的角色与协同关系,并重点讲解了Memtools的图形界面配置步骤、烧录操作流程,以及针对“无法连接设备”、“编程失败”等常见错误的系统性排查与解决方案,帮助开发者快速上手并规避典型陷阱。

weixin_29189377的博客 634

.NET CORE 简单的导出方法

.NET CORE 简单的导出方法

一代枭雄_宗某的博客 1466

68页|大型车企集团数字化转型汽车数字化信息系统平台规划方案

这份PPT文档提供了一个全面的汽车集团数字化转型规划方案,涵盖了项目目标、规划思路、实施关注点、解决方案建议以及合作优势等多个方面。

baidu_25525561的博客 1328

C#保存数据到文件,读取文件数据

C#保存数据到文件,SaveToFile(String data, String name, bool mute)

暂无内容 2万+

相机光学(三十八)——VCM(Voice Coil Motor)音圈马达

VCM(Voice Coil Motor)音圈马达全称Voice Coil Montor,电子学里面的音圈电机,是马达的一种。因为原理和扬声器类似,所以叫音圈电机,具有高频响、高精度的特点。其主要原理是在一个永久磁场内,通过改变马达内线圈的直流电流大小,来控制弹簧片的拉伸位置,从而带动上下运动。手机摄像头广泛的使用VCM实现自动对焦功能,通过VCM可以调节镜头的位置,呈现清晰的图像。弹片式结构滚珠式结构摩擦式结构Open loop开马达Close loop闭环马达。

图像学习之旅 7217

PDDL入门

PDDL的组成部分 Objects:对象,世界上我们感兴趣的事物。 Predicates:谓词,我们感兴趣的事实(例如对象的属性),可以为真,也可以为假。 An initial state:初始化状态,我们开始所处的世界状态,即开始时为真的事物。 Goal specification:目标状态,我们想要结束的世界的状态,即我们希望最终成为真实的事情。 Actions/Operators:动作/操作,改变世界状态的方式,即发生的事情改变了事实。 PDDL语法 PDDL 文件的扩展名通常是.pddl 要

工控小白2021的博客 4821

使用ASP.NET的GridView导出/儲存資料至Excel,Word,Txt檔,Powerpoint

 ps.註解的部分屬於儲存檔案的程式碼 excel.aspx 02 03 http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">04 http://www.w3.org/1999/xhtml">05 06     未命名頁面07 08 09     10                                           

lee576的专栏 2848

手把手教你用Synopsys AHB VIP搭建验证环境:从SINGLE到WRAP16的完整波形分析与避坑指南

本文详细介绍了如何使用Synopsys AHB VIP搭建验证环境,从基础配置到复杂波形调试实战。重点解析了AHB协议中各种Burst类型的地址计算机制,包括INCR和WRAP类型,并提供了实际案例和避坑指南,帮助工程师快速掌握验证技巧。

weixin_42552716的博客 414

ASP.NET中将数据输出到WORD、EXCEL、TXT、HTM

 Submitted by 浪淘沙 on 2008, June 18, 6:03 PM. asp.net其实,利用ASP.NET输出指定内容的WORD、EXCEL、TXT、HTM等类型的文档很容易的。主要分为三步来完成。   一、定义文档类型、字符编码 Response.Clear();  Response.Buffer= true;  Response.Charset="utf-8"

李中祁的专栏 667

【TC3xx芯片】TC3xx芯片PFlash的ECC校验问题补充

TC3xx芯片PFlash的ECC校验问题补充

qq_36056498的博客 1153

零基础入门simulink仿真--通信领域的调制解调技术:基于Simulink的PM信号调制与解调仿真建模示例

PM的基本原理是将基带信号(如语音或音乐信号)加载到高频载波信号的相位上。通过改变载波的瞬时相位,可以实现信息的传输。PM的优点包括抗噪声能力强、频谱利用率较高等,但其解调过程相对复杂。通过Simulink,我们可以通过模块化的建模方式实现PM信号的调制和解调过程,并观察信号在信道中的传输效果。通过本指南,我们介绍了如何基于Simulink搭建一个完整的PM信号调制与解调仿真模型,并进行仿真和性能评估。背景介绍:理解PM信号调制与解调的基本原理及其应用。所需工具和环境:列出进行PM仿真所需的工具和环境。

amy_mhd的博客 604

从数据库导出数据到word、excel、.txt _asp.net技巧

using System; using System.Data; using System.Drawing; using System.Data.SqlClient; using Excel; using Word; using System.IO; namespa

545

MATLAB和S7-1200PLC水箱液位高度PID控制联合仿真(KEPserverOPC通信应用)

SMART PLC 向导PID的详细介绍请查看下面文章链接:S7-200 SMART PLC PID向导详细介绍(如何实现P、PD、PID控制器)-优快云博客文章浏览阅读1k次。这篇博客主要介绍SMART PLC PID向导的使用,PID控制相关的其它内容请查看专栏系列文章,常用链接如下:SMART PLC PID负压控制(过程量为负数)_负压控制pid控制程序_RXXW_Dor的博客-优快云博客1、如何实现PID反作用调节?S7-1200PLC和KEPserver OPC通信-优快云博客。

RXXW_Dor的博客 1781
上一篇: CSS选项卡(onmouseover)
下一篇: Ajax AutoComplete 在Sql数据库中读取数据
beichen_
博客等级 码龄19年 17粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值