C#中word导出功能的骚操作详解

前言

马上过牛年了,先祝大家新年好,身体好,心情好!!!

年前最后写一篇之前项目开发的一个功能,自己根据系统业务,想到的一个解决办法,效率还是不错的,废话不多说,开整!!!

需求:

企业填报自己的企业信息到系统中,最后需要将数据以给定word模板形式导出,功能简单,就是要开发快,赶及

分析:主要费时间的工作是设计企业填报表单设计实现,以及根据提供的word模板导出数据这块儿,因为涉及到的表单比较多,一个表单最少也有差不多150多个字段,一个一个对,头发也得一把一把的掉

想到的解决法案:在导出word这个功能模块儿,写一些通用的方法,减少一些工作量。

        word数据导出功能,思路就是在word模板中每一个需要填数据的地方命名一个标签,代码中找到对应命名的标签,插入数值

传统做法,第一步:在word模板中填写标签 第二步:程序中每个插入字段数据和word模板标签对应,最后插值,这样做有一个问题就是比较耗时间,而且很容易出错

        我的做法,第一步:给数据字段一个自定义特性,在自定定义特性中写上对应的标签地址,应用反射的方法将数据最终插入到word模板中。这样就省去了第一步在word中写标签这样繁杂的操作。这样做的问题就是性能比较差,但是可以忽略不计

大体思路就这样,我就单独写一个demo供大家参考,之后能用就用,重在思路和想法的分享和讨论

开写:

新建一个项目:ExportWordModel

最终项目简易结构:

将没用的东西全部去掉,修改Index.cshtml页面成这样:

@{
 ViewBag.Title = "Home Page";
}
<div class="jumbotron" style="text-align: center">
 @*<h1>ASP.NET</h1>*@
 <input type="button" value="导出" onclick="location.href = '@Url.Action("GetExport","Home")'" />
</div>

在 HomeController 中创建:GetExport

创建一个类ExportFileOperator(所有的word操作),此类需要继承Controller,因为有返回File操作方法

1、 在GetExport中首先命名一个导出word标题就叫:测试导出Word文件

string title = "测试导出Word文件";

创建doc:

 var doc = ExportFileOperator.CreateBuilder("GroupForm.doc");

2、CreateBuilder方法实现为(此处操作需要Aspose.Word组件,是操作word的,这个需要大家自己去找一下,或者网上找个破解的):

private static string _tempPath = AppDomain.CurrentDomain.BaseDirectory;
public static (Document doc, DocumentBuilder builder) CreateBuilder(string tempFileName)
{
 string tempPath = $"{_tempPath}{tempFileName}";
 Document doc = new Document(tempPath);
 return (doc, new DocumentBuilder(doc));
}

3、插入标题(需要在word中写一个标签,作为标题插入的地址):

最终可以显示结果为这样:

方法:

ExportFileOperator.InsertTitle(ref doc.Item2, title);//插入标题
public static void InsertTitle(ref DocumentBuilder builder, string fileName, string tempBookMarkName = "title")
{
  builder.MoveToBookmark(tempBookMarkName);
  builder.Write(fileName);
}

4、根据业务实体,将实体数据写入到word中,也是核心所在

首先命名一个数据类:

public class EnterpriseEntity
 {
   #region 实体成员
  /// <summary>
  /// id
  /// </summary>
  public string id { get; set; }
  /// <summary>
  /// 团队名
  /// </summary>
  [Description("企业名称")]
  public string v1 { get; set; }
  /// <summary>
  /// 统一社会信用代码
  /// </summary>
  [Description("统一社会信用代码")]
  public string v3 { get; set; }
  /// <summary>
  /// 成立日期
  /// </summary>
  [Description("成立日期")]
  public string v4 { get; set; }

  /// <summary>
  /// 参赛行业领域
  /// </summary>
  [Description("参赛行业领域")]
  public string v5 { get; set; }
  /// <summary>
  /// 行政区域
  /// </summary>
  [Description("行政区域")]
  public string v6 { get; set; }
  /// <summary>
  /// 是否属于国家高新区内的企业
  /// </summary>
  [Description("属于国家高新区内的企业")]
  public string v7 { get; set; }
  /// <summary>
  /// 是否属于国家级经济开发区内的企业
  /// </summary>
  [Description("属于国家级经济开发区内的企业")]
  public string v9 { get; set; }
  /// <summary>
  /// 是否属于国家级科技企业孵化器内的企业
  /// </summary>
  [Description("属于国家级科技企业孵化器内的企业")]
  public string v11 { get; set; }
  /// <summary>
  /// 是否属于国家大学科技园内的企业
  /// </summary>
  [Description("属于国家大学")]
  public string v13 { get; set; }
  /// <summary>
  /// 是否国家备案的众创空间内的企业
  /// </summary>
  [Description("国家备案的众创空间内的企业")]
  public string v20 { get; set; }
  /// <summary>
  /// 企业注册类型
  /// </summary>
  [Description("企业注册类型")]
  public string v22 { get; set; }
  /// <summary>
  /// 注册资本
  /// </summary>
  [Description("注册资本")]
  public string v24 { get; set; }
  /// <summary>
  /// 实收资本(万元人民币)
  /// </summary>
  [Description("实收资本")]
  public string v25 { get; set; }
  /// <summary>
  /// 企业注册地址
  /// </summary>
   [Description("企业注册地址")]
  public string v26 { get; set; }
  /// <summary>
  /// 邮政编码
  /// </summary>
  [Description("注册地邮政编码")]
  public string v27 { get; set; }
  /// <summary>
  /// 通信地址
  /// </summary>
   [Description("通信地址")]
  public string v28 { get; set; }
  /// <summary>
  /// 邮政编码
  /// </summary>
   [Description("通讯地邮政编码")]
  public string v29 { get; set; }
  /// <summary>
  /// 企业网址
  /// </summary>
  [Description("企业网址")]
  public string v30 { get; set; }
  /// <summary>
  /// 企业官方微信
  /// </summary>
  [Description("企业官方微信")]
  public string v31 { get; set; }
  /// <summary>
  /// 职工总数
  /// </summary>
   [Description("职工总数")]
  public string v32 { get; set; }
  /// <summary>
  /// 博 士人数
  /// </summary>
  [Description("博 士")]
  public string v33 { get; set; }
  /// <summary>
  /// 硕 士人数
  /// </summary>
  [Description("硕 士")]
  public string v34 { get; set; }
  /// <summary>
  /// 本 科人数
  /// </summary>
  [Description("本 科")]
  public string v35 { get; set; }
  /// <summary>
  /// 大专及以下人数
  /// </summary>
  [Description("大专及以下")]
  public string v36 { get; set; }
  /// <summary>
  /// 高级职称人数
  /// </summary>
  [Description("高级职称")]
  public string v37 { get; set; }
  /// <summary>
  /// 中级职称人数
  /// </summary>
  [Description("中级职称")]
  public string v38 { get; set; }
  /// <summary>
  /// 初级职称人数
  /// </summary>
  [Description("初级职称")]
  public string v39 { get; set; }
  /// <summary>
  /// 高级技工人数
  /// </summary>
  [Description("高级技工")]
  public string v40 { get; set; }
  /// <summary>
  /// 上市公司控股企业是否
  /// </summary>
  [Description("上市公司控股企业")]
  public string v41 { get; set; }
  /// <summary>
  /// 新三板企业是否
  /// </summary>
  [Description("新三板企业")]
  public string v42 { get; set; }
  /// <summary>
  /// 高新技术企业是否
  /// </summary>
  [Description("高新技术企业")]
  public string v43 { get; set; }
  /// <summary>
  /// 获得时间
  /// </summary>
  [Description("获得时间")]
  public string v44 { get; set; }
  /// <summary>
  /// 登记入库的科技型中小企业是否
  /// </summary>
  [Description("登记入库的科技型中小企业")]
  public string v45 { get; set; }
  /// <summary>
  /// 企业概要(不超1000字)
  /// </summary>
  [Description("企业概要")]
  public string v46 { get; set; }
  /// <summary>
  /// 关 键 词
  /// </summary>
  [Description("关 键 词")]
  public string v47 { get; set; }
  /// <summary>
  /// 现融资阶段
  /// </summary>
  [Description("现融资阶段")]
  public string v48 { get; set; }
  /// <summary>
  /// 参赛项目产品图片
  /// </summary>
  public string v49 { get; set; }
  /// <summary>
  /// 参赛项目收入占去年企业营业收入比例
  /// </summary>
  [Description("参赛项目收入占去年企业营业收入比例")]
  public string v50 { get; set; }
  /// <summary>
  /// 参赛项目介绍(1000字以内)
  /// </summary>
  [Description("参赛项目介绍(1000字以内)")]
  public string v51 { get; set; }
  /// <summary>
  /// 当前五大客户
  /// </summary>
  [Description("当前五大客户")]
  public string v52 { get; set; }
  /// <summary>
  /// 当前五大供应商
  /// </summary>
  [Description("当前五大供应商")]
  public string v53 { get; set; }
  /// <summary>
  /// 国内市场地位排名
  /// </summary>
  [Description("国内市场地位排名")]
  public string v54 { get; set; }
  /// <summary>
  /// 商业模式及业务拓展计划
  /// </summary>
  [Description("商业模式及业务拓展计划")]
  public string v56 { get; set; }
  /// <summary>
  /// 经营风险与对策
  /// </summary>
  [Description("经营风险与对策")]
  public string v57 { get; set; }
  /// <summary>
  /// 企业管理模式
  /// </summary>
  [Description("企业管理模式")]
  public string v58 { get; set; }
  /// <summary>
  /// 公司对管理层及关键人员是否已采取激励措施是否
  /// </summary>
  [Description("公司对管理层及关键人员是否已采取激励措施")]
  public string v59 { get; set; }
  /// <summary>
  /// 公司是否考虑员工持股问题?是否
  /// </summary>
  [Description("公司是否考虑员工持股问题")]
  public string v60 { get; set; }
  /// <summary>
  /// 企业其他技术、产品及服务(1000字以内)
  /// </summary>
  [Description("企业其他技术、产品及服务(1000字以内)")]
  public string v61 { get; set; }
  /// <summary>
  /// 参赛目的
  /// </summary>
  [Description("参赛目的")]
  public string v62 { get; set; }
  /// <summary>
  /// 并购需求
  /// </summary>
  [Description("并购需求")]
  public string v63 { get; set; }
  /// <summary>
  /// 申请大赛组织的大企业对接活动是否
  /// </summary>
  [Description("申请大赛组织的大企业对接活动")]
  public string v64 { get; set; }
  /// <summary>
  /// 资金使用计划
  /// </summary>
  [Description("债权融资资金使用计划")]
  public string v65 { get; set; }
  /// <summary>
  /// 股权融资需求是否
  /// </summary>
  [Description("直接从事研发科技人员数")]
  public string v66 { get; set; }
  /// <summary>
  /// 融资金额(万元¥)
  /// </summary>
  [Description("上年度吸纳高校应届毕业生人数")]
  public string v67 { get; set; }
  /// <summary>
  /// 拟出让股权比例
  /// </summary>
  [Description("参赛项目名称")]
  public string v68 { get; set; }
  /// <summary>
  /// 融资时间
  /// </summary>
  [Description("产品市场分析及竞争优势")]
  public string v69 { get; set; }
  /// <summary>
  /// 资金使用计划
  /// </summary>
  [Description("股权融资资金使用计划")]
  public string v70 { get; set; }
  /// <summary>
  /// 申请大赛推荐投资机构是否 (修改 申请大赛推荐信贷机构)
  /// </summary>
  [Description("申请大赛推荐信贷机构")]
  public string v71 { get; set; }
  /// <summary>
  /// 申请大赛组织的融资路演是否 (修改 申请大赛推荐投资机构)
  /// </summary>
  [Description("申请大赛推荐投资机构")]
  public string v72 { get; set; }
  /// <summary>
  /// 申请国家科技成果转化引导基金设立的子基金推荐 (修改 申请大赛组织的融资路演)
  /// </summary>
  [Description("申请大赛组织的融资路演")]
  public string v73 { get; set; }
  #endregion

  public List<string> GetThisDescriptionName()
  {
   var result = new List<string>();
   GetType().GetProperties().ToList().ForEach(f =>
   {
    var descriptionObj = (DescriptionAttribute[])f.GetCustomAttributes(typeof(DescriptionAttribute), false);
    if (descriptionObj.Length > 0 && !string.IsNullOrWhiteSpace(descriptionObj[0].Description))
    {
     result.Add(descriptionObj[0].Description);
    }
   });
   return result;
  }
 }

其中重要的地方是:需要给每个字段一个Description,这里面的值对应的就是word模板中的名称,如下:

这里因为数据是保密的,我就将一些字段删除了,包括word模板中的一些也删除了,就拿出一部分。

和数据库交互的部分我也没写,就将查出来的数据先命名一个_enterpriseStr,最后用Newtonsoft转换成实体这样操作了哈:

 EnterpriseEntity enterprise = JsonConvert.DeserializeObject<EnterpriseEntity>(_enterpriseStr);

5、将查出来的数据,插入到word中,完成最终的导出:

ExportFileOperator.InsertFormData(enterprise, ref doc.Item1);//实体数据插入
return new ExportFileOperator().FileResult(title, doc.Item1);

其中最重要的方法就是InsertFormData这个,他的实现如下:

public static void InsertFormData<T>(T objFormData, ref Document document)
{
   NodeCollection allTables = document.GetChildNodes(NodeType.Table, true);
   List<string> headDescribeNameList = GetObjectHeadDescription<T>();//获取实体中每个Description中的值
   foreach (Table tableFirst in allTables)
   {
    for (int headIndex = 0; headIndex < headDescribeNameList.Count; headIndex++)//循环实体中的每个DescribeName
    {
     for (int rowIndex = 0; rowIndex < tableFirst.Rows.Count; rowIndex++)//遍历word模板中所有的table
     {
      for (int cellIndex = 0; cellIndex < tableFirst.Rows[rowIndex].Cells.Count; cellIndex++)//遍历模板中所有的table每行的列数
      {
       if (tableFirst.Rows[rowIndex].Cells[cellIndex].GetText() != null && tableFirst.Rows[rowIndex].Cells[cellIndex].GetText().Contains(headDescribeNameList[headIndex]) &&
         ((tableFirst.Rows[rowIndex].Cells.Count > cellIndex && tableFirst.Rows[rowIndex].Cells[cellIndex + 1] != null && tableFirst.Rows[rowIndex].Cells[cellIndex + 1].GetText().Equals("\a")) || (tableFirst.Rows.Count > rowIndex && tableFirst.Rows[rowIndex + 1] != null && tableFirst.Rows[rowIndex + 1].Cells[cellIndex] != null && tableFirst.Rows[rowIndex + 1].Cells[cellIndex].GetText().Equals("\a"))))//如果遍历的cell不为空、其中的值能和DescribeName匹配上,并且这个单元的右边的cell或者下边cell有占位,而且是空,就在此处插入值
       {
        var objValue = GetObjectValueByPropName(objFormData, headDescribeNameList[headIndex]);//根据DescribeName获取对应的值
        if (tableFirst.Rows[rowIndex].Cells.Count > cellIndex && tableFirst.Rows[rowIndex].Cells[cellIndex + 1] != null && tableFirst.Rows[rowIndex].Cells[cellIndex + 1].GetText().Equals("\a"))
        {
         InsertCell(objValue, document, tableFirst.Rows[rowIndex].Cells[cellIndex + 1]);//优先在右变空位插入值
         break;
        }
        InsertCell(objValue, document, tableFirst.Rows[rowIndex + 1].Cells[cellIndex]);//右侧如果没有就在下边空位插入值
        break;
       }
      }
     }
    }
   }
 }
 public static List<string> GetObjectHeadDescription<T>()
{
 var obj = Activator.CreateInstance<T>();
 MethodInfo method = obj.GetType().GetMethod("GetThisDescriptionName", new Type[] { });//每个实体需要有GetThisDescriptionName这个方法
 return (List<string>)(method?.Invoke(obj, null));
 }

其中GetThisDescriptionName方法需求在每个实体类中有实现:

根据descriptionName获取实体中的值:

private static string GetObjectValueByPropName<T>(T objFormData, string descriptionName)
{
   try
   {
    var properties = objFormData.GetType().GetProperties();
    foreach (var propertyInfo in properties)
    {
     var descriptionAttributes = (DescriptionAttribute[])propertyInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
     if (descriptionAttributes.Length > 0 && !string.IsNullOrWhiteSpace(descriptionAttributes[0].Description) && descriptionAttributes[0].Description.Equals(descriptionName))
     {
      return propertyInfo.GetValue(objFormData) == null ? "无" : propertyInfo.GetValue(objFormData).ToString();
     }
    }
    return "无";
   }
   catch (Exception e)
   {
    Console.WriteLine(e);
    throw;
   }
}

在cell中插入值:

private static void InsertCell(string value, Document doc, Cell cell)
 {
   Cell insertCell = cell;
   insertCell.FirstParagraph.Remove();
   Paragraph p = new Paragraph(doc);
   p.AppendChild(new Run(doc, (value == null ? "" : value)));
   p.ParagraphFormat.Alignment = ParagraphAlignment.Center;
   insertCell.CellFormat.VerticalAlignment = CellVerticalAlignment.Center;
   insertCell.AppendChild(p);
 }

最后一个方法FileResult:

public FileResult FileResult(string fileName, Document doc)
{
   var filePathName = $"{fileName}.doc";
   doc.Save(Path.Combine(_tempPath, "temp", filePathName), SaveFormat.Doc); //保存word
   filePathName = Path.Combine(_tempPath, "temp", filePathName);
   return File(filePathName, "application/doc", $"{fileName}.Doc");
}

最终效果:

最后说一下,其中有一些细节的地方还是需要做一些处理,暂时没时间写,后期有时间补,先就这样了

大家有什么好的想法或者更好的实现方式,尽管提出来,共同进步

git地址:https://github.com/Binzm/ExportWorkdModel.git

总结

到此这篇关于C#中word导出功能骚操作的文章就介绍到这了,更多相关C# word导出功能内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C# 大数据导出word的假死报错的处理方法

    最近一个项目是一个基于winform的报告系统,根据一系列的查询参数计算出结果,最终生成一个格式规范的word文档,刚开始数据量不大(500行)数据以内,写入速度还能接受,但最近遇到一个问题就是当出现大量的数据行的时候,写入word的过程就变的非常慢,CPU直接拉到100%,本人机器配置已经算比较高的了,8G内存+i5CPU,依旧假死,该问题困扰了我几天,也问了google很多次,基本上给出的答案都是word本身就比较慢这样一类的答案,或者是非托管代码的优化,慢也就算了,至少可以通过进度条来交互

  • C#导出文本内容到word文档的方法

    本文实例讲述了C#导出文本内容到word文档的方法.分享给大家供大家参考.具体实现方法如下: <%@ Page Language="C#" AutoEventWireup="true" %> <script runat="server"> protected void Page_Load(object sender, EventArgs e) { Repeater1.DataSource = new String[] {

  • C#实现将数据导出到word或者Excel中的方法

    本文实例讲述了C#实现将数据导出到word或者Excel中的方法.分享给大家供大家参考.具体如下: void OutToWord() { if (dataGridView1.Rows.Count >= 1) { string tempstr =""; Stream myStream; SaveFileDialog dlg =new SaveFileDialog(); dlg.Filter = "(Word文件)*.doc|*.doc"; //dlg.Filte

  • C#中word导出功能的骚操作详解

    前言 马上过牛年了,先祝大家新年好,身体好,心情好!!! 年前最后写一篇之前项目开发的一个功能,自己根据系统业务,想到的一个解决办法,效率还是不错的,废话不多说,开整!!! 需求: 企业填报自己的企业信息到系统中,最后需要将数据以给定word模板形式导出,功能简单,就是要开发快,赶及 分析:主要费时间的工作是设计企业填报表单设计实现,以及根据提供的word模板导出数据这块儿,因为涉及到的表单比较多,一个表单最少也有差不多150多个字段,一个一个对,头发也得一把一把的掉 想到的解决法案:在导出wo

  • Java中对List集合的常用操作详解

    目录: 1.list中添加,获取,删除元素: 2.list中是否包含某个元素: 3.list中根据索引将元素数值改变(替换): 4.list中查看(判断)元素的索引: 5.根据元素索引位置进行的判断: 6.利用list中索引位置重新生成一个新的list(截取集合): 7.对比两个list中的所有元素: 8.判断list是否为空: 9.返回Iterator集合对象: 10.将集合转换为字符串: 11.将集合转换为数组: 12.集合类型转换: 备注:内容中代码具有关联性. 1.list中添加,获取,

  • 对tensorflow中cifar-10文档的Read操作详解

    前言 在tensorflow的官方文档中得卷积神经网络一章,有一个使用cifar-10图片数据集的实验,搭建卷积神经网络倒不难,但是那个cifar10_input文件着实让我费了一番心思.配合着官方文档也算看的七七八八,但是中间还是有一些不太明白,不明白的mark一下,这次记下一些已经明白的. 研究 cifar10_input.py文件的read操作,主要的就是下面的代码: if not eval_data: filenames = [os.path.join(data_dir, 'data_b

  • Android中实现ping功能的多种方法详解

    使用java来实现ping功能. 并写入文件.为了使用java来实现ping的功能,有人推荐使用java的 Runtime.exec()方法来直接调用系统的Ping命令,也有人完成了纯Java实现Ping的程序,使用的是Java的NIO包(native io, 高效IO包).但是设备检测只是想测试一个远程主机是否可用.所以,可以使用以下三种方式来实现: 1. Jdk1.5的InetAddresss方式 自从Java 1.5,java.net包中就实现了ICMP ping的功能. 使用时应注意,如

  • QT中对Mat类的一些操作详解

    目录 一.类型转换 二.保存至数据库 一.类型转换 opencv在QT中的应用通常会涉及到这三者的转换,即Mat.QImage.QPixmap.下面分别给出了 Mat转QImage QImage转Mat Mat转QPixmap 1️⃣:Mat转QImage QImage MainWindow::MatToImage(const Mat &m) //Mat转Image { switch(m.type()) { case CV_8UC1: { QImage img((uchar *)m.data,m

  • 工作中Java集合的规范使用操作详解

    目录 一.前言 二.规范使用Java集合 一.前言 现代软件行业的高速发展对开发者的综合素质要求越来越高,因为不仅是编程知识点,其它维度的知识点也会影响到软件的最终交付质量.比如:五花八门的错误码会人为地增加排查问题的难度:数据库的表结构和索引设计缺陷带来的系统架构缺陷或性能风险:工程结构混乱导致后续项目维护艰难:没有鉴权的漏洞代码容易被黑客攻击等.依据约束力强弱及故障敏感性,规约依次分为[强制].[推荐].[参考]三大类.在延伸的信息中,“说明”对规约做了适当扩展和解释:“正例”提倡什么样的编

  • Python中sys模块功能与用法实例详解

    本文实例讲述了Python中sys模块功能与用法.分享给大家供大家参考,具体如下: sys-系统特定的参数和功能 该模块提供对解释器使用或维护的一些变量的访问,以及与解释器强烈交互的函数.它始终可用. sys.argv 传递给Python脚本的命令行参数列表.argv[0]是脚本名称(依赖于操作系统,无论这是否是完整路径名).如果使用-c解释器的命令行选项执行命令,argv[0]则将其设置为字符串'-c'.如果没有脚本名称传递给Python解释器,argv[0]则为空字符串. 要循环标准输入或命

  • db2 导入导出单个表的操作详解

    1.导出整个数据库表结构.方法.存储过程等,执行脚本: db2look –d dbname –e –o db.sql –i username –w password db2 -tvf db.sql 2.单表数据的导出及导入: 导出:db2move dbname export -tn tablename -u db2user -p psw 导入:db2move dbname import -u db2user -p psw 3.数据库的备份.恢复: 备份:db2 BACKUP DATABASE d

  • Java中集合关系图及常见操作详解

    下面是一张下载的Java中的集合类型的继承关系图,便于正确的理解和使用相应的集合类型. 几个面试常见问题: 1.Q:ArrayList和Vector有什么区别?HashMap和HashTable有什么区别? A:Vector和HashTable是线程同步的(synchronized).性能上,ArrayList和HashMap分别比Vector和Hashtable要好. 2.Q:大致讲解java集合的体系结构 A:List.Set.Map是这个集合体系中最主要的三个接口.       其中Lis

  • C++中4种类型转换方式 cast操作详解

    Q:什么是C风格转换?什么是static_cast,dynamic_cast以及reinterpret_cast?区别是什么?为什么要注意? A:转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式.为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符.比如,为了转换一个类型为doubole的浮点数的指针到整型:代码:inti;doubled; i=(int)d;或者: i=int(d); 对于具有标准定义转换的简单类型而言工作的很好.然而,这样的转换符也能不分皂白的

随机推荐