前言

一个游戏通常需要10多个Excel表格或者更多来配置,一般会通过导出csv格式读取配置。

本文提供导出Excel直接生成c#文件,对应数据直接生成结构体和数组,方便开发排错和简化重复写每个表格的读取配置方法。

导出效果

                  

上图左图为Excel表格数据,右图 为导出生成的cs文件。

ExcelAddIn工程

  官方文档:https://msdn.microsoft.com/en-us/library/jj620922.aspx

项目环境配置(VS2015配置):

  1、根据博客The Visual Studio Blog VS2015需要下载一个Update,其他的VS版本没试过。

  2、Microsoft Visual Studio Tools for Applications 2015 SDK

  3、Visual Studio 2010 Tools for Office Runtime

依次安装上述SDK,重启VS后新建项目看到可以创建Excel的外接程序了。如下图:

为了在加载项显示对应的按钮图标,需要在项目工程上右键->添加->选择功能区窗口,如下图:

在窗口界面中通过可视化界面可以直接编辑对应的点击按钮功能等。

导出模板

       为了方便导出数据配置,在项目中添加一个App.config:

配置如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="template" value="//
// #SHEET_NAME# 表格名
//
// #PARAM_DEF# 定义结构体参数
// #DATA_DEF# 初始化表格数据
// #PAIR_DEF# 定义每个参数数据 需要在#DATA_DEF#定义内
using System;
public struct ES_#SHEET_NAME#
{
#PARAM_DEF#
public {} {};
#PARAM_END#
}; public partial class ESSheet
{
private static ES_#SHEET_NAME#[] _#SHEET_NAME# = null;
public static ES_#SHEET_NAME#[] F#SHEET_NAME#
{
get
{
if (_#SHEET_NAME#==null)
{
_#SHEET_NAME# = new ES_#SHEET_NAME#[]
{
#DATA_DEF# new ES_#SHEET_NAME# { #PAIR_DEF#{}={}#PAIR_END# }, #DATA_END#
};
}
return _#SHEET_NAME#;
}
}
};" />
</appSettings>
</configuration>

正则解析数据代码如下:

// export c#
Excel.Worksheet worksheet = (Excel.Worksheet)Globals.ThisAddIn.Application.ActiveSheet; string s = System.Configuration.ConfigurationManager.AppSettings.Get("template");
//去注释
Regex regex = new Regex("//[^\\r\\n]*[\\r\\n]+");
var match = regex.Match(s);
while (match.Success)
{
s = s.Replace(match.Value, "");
match = regex.Match(s);
}
// 替换表格名字
string clsName = worksheet.Name;
regex = new Regex(@"#SHEET_NAME#");
match = regex.Match(s);
while (match.Success)
{
s = s.Replace(match.Value, clsName);
match = regex.Match(s);
} // 参数定义
regex = new Regex("#PARAM_DEF#.*#PARAM_END#", RegexOptions.Singleline);
match = regex.Match(s);
if (match.Success)
{
string formatStr = match.Value.Replace("#PARAM_DEF#", "");
formatStr = formatStr.Replace("#PARAM_END#", "").Trim(); StringBuilder sb = new StringBuilder();
for (int i = ; i < columnCount; i++)
{
sb.AppendFormat(formatStr, param_types[i], param_names[i]);
if (i != columnCount - )
{
sb.AppendLine();
}
}
s = s.Replace(match.Value, sb.ToString());
}
else
{
MessageBox.Show("#PARAM_DEF# 匹配失败!");
return;
} // 数据定义
regex = new Regex("#DATA_DEF#.*#DATA_END#", RegexOptions.Singleline);
match = regex.Match(s);
if (match.Success)
{
string matchAllStr = match.Value;
string formatStr = matchAllStr.Replace("#DATA_DEF#", "");
formatStr = formatStr.Replace("#DATA_END#", "").Trim(); regex = new Regex("#PAIR_DEF#.*#PAIR_END#", RegexOptions.Singleline);
match = regex.Match(formatStr);
if (match.Success)
{
string pairStr = match.Value;
string formatStr2 = pairStr.Replace("#PAIR_DEF#", "");
formatStr2 = formatStr2.Replace("#PAIR_END#", "").Trim(); regex = new Regex(@"string");
StringBuilder sb = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
for (int i = ; i <= rowCount; i++)
{
sb2.Clear();
for (int j = ; j <= columnCount; j++)
{ string stype = param_types[j - ];
string sname = param_names[j - ];
bool strflg = regex.Match(stype).Success; var value = (worksheet.Cells[i, j] as Excel.Range).Value;
bool nullflg = value == null;
if (!nullflg)
{
string vstr = value.ToString();
vstr = vstr.Trim();
if (string.IsNullOrEmpty(vstr))
{
nullflg = true;
}
else
{
if (strflg)
{
vstr = string.Format("\"{0}\"", vstr);
}
sb2.AppendFormat(formatStr2, sname, vstr);
}
}
if (nullflg)
{
// null cell
if (strflg)
{
// string type?
sb2.AppendFormat(formatStr2, sname, "\"\"");
}
else
{
sb2.AppendFormat(formatStr2, sname, );
}
}
if (j != columnCount)
{
sb2.Append(',');
}
} sb.Append(formatStr.Replace(pairStr, sb2.ToString()));
if (i != rowCount)
{
sb.AppendLine();
}
}
s = s.Replace(matchAllStr, sb.ToString());
}
else
{
MessageBox.Show("#PAIR_DEF# 匹配失败!");
return;
}
}
else
{
MessageBox.Show("#DATA_DEF# 匹配失败!");
return;
}

部分说明

1、几个导出定义:第一行 参数名 , 第二行  参数类型  ,第三行起为 数据,表格名为 结构体名字 。

2、Globals.ThisAddIn.Application.ActiveSheet 为当前选中的Excel表格。

3、获取 i 行 j 列数据方法如下:

var value = (worksheet.Cells[i, j] as Excel.Range).Value;

4、这里导出cs文件,如果需要导出cpp文件可以自己修改上面的模板配置即可实现。

导出路径设置

由于插件没有存储数据的地方,因此这里将导出路径直接存在了注册表上。

方法如下:

     #region RegistStoreData
public static readonly string registryPath = @"Software\YourCompanyName\YourAddInName"; public static void StoreInRegistry(string keyName, string value)
{
RegistryKey rootKey = Registry.CurrentUser;
using (RegistryKey rk = rootKey.CreateSubKey(registryPath))
{
rk.SetValue(keyName, value, RegistryValueKind.String);
}
} public static string ReadFromRegistry(string keyName, string defaultValue = "")
{
RegistryKey rootKey = Registry.CurrentUser;
using (RegistryKey rk = rootKey.OpenSubKey(registryPath, false))
{
if (rk == null)
{
return defaultValue;
} var res = rk.GetValue(keyName, defaultValue);
if (res == null)
{
return defaultValue;
} return res.ToString();
}
}
#endregion
下载

完整代码地址:https://github.com/mydishes/ESExport

可执行插件地址https://github.com/mydishes/ESExport/tree/master/public

Excel导出插件的更多相关文章

  1. Excel导出插件-VSTO

    前言 一个游戏通常需要10多个Excel表格或者更多来配置,一般会通过导出csv格式读取配置. 本文提供导出Excel直接生成c#文件,对应数据直接生成结构体和数组,方便开发排错和简化重复写每个表格的 ...

  2. jsexcel导出插件

    ExcelTable.js /* * author:wenluanlai */ (function ($) { Date.prototype.Format = function (fmt) { var ...

  3. PHP原生EXCEL导出带样式无插件无乱码实现

    PHP原生EXCEL导出 经测试 带样式 无插件 无乱码,不需要引入任何插件,不需要修改任何编码 (使用时只需要修改引入php数据库配置文件.修改thead tbody中的数据即可.根据自己的需要去接 ...

  4. Asp.Net 常用工具类之Office—Excel导出(4)

    开发过程中各类报表导入导出防不胜防,网上也是各种解决方法层出不穷,比如Excel,CSV,Word,PDF,HTML等等... 网上各种导出插件也是层出不穷,NPOI,微软Microsoft.Offi ...

  5. .NET Excel导出方法及其常见问题详解

    摘要:.NET Excel导出方法及其常见问题详解. 一.Excel导出的实现方法 在.net 程序开发中,对于Excel文件的导出我们一共有三种导出方式: 利用文件输出流进行读写操作 这种方式的导出 ...

  6. .Net Excel 导出图表Demo(柱状图,多标签页) .net工具类 分享一个简单的随机分红包的实现方式

    .Net Excel 导出图表Demo(柱状图,多标签页) 1 使用插件名称Epplus,多个Sheet页数据应用,Demo为柱状图(Epplus支持多种图表) 2 Epplus 的安装和引用 新建一 ...

  7. laravel 导出插件

    转发:https://blog.csdn.net/gu_wen_jie/article/details/79296470 版本:laravel5 php 5.6 安装步骤: 一.安装插件 ①.首先在L ...

  8. js-xlsx 实现前端 Excel 导出(支持多 sheet)

    之前写文章介绍了使用 js-xlsx 实现导入 excel 的功能,现在再介绍一下如何使用 js-xlsx 进行 excel 导出. [实现步骤] 1. 首先安装依赖 npm install xlsx ...

  9. [moka同学笔记]PHPexcel之excel导出和导入

    原案例来自http://www.sucaihuo.com/有修改 1.目录结构(文件不用解释,应该都可以看得懂,直接看代码)

随机推荐

  1. Tomca软件介绍和安装

    Web开发入门 软件的结构: C/S (Client - Server  客户端-服务器端) 典型应用:QQ软件 ,飞秋,红蜘蛛. 特点: 1)必须下载特定的客户端程序. 2)服务器端升级,客户端升级 ...

  2. 结对编程1-四则运算(基于GUI)

    林晓芳201421123092.陈惠201421123096 coding 地址:https://git.coding.net/lianlian/92.96.1.git 一.题目描述 我们在个人作业1 ...

  3. 团队作业6——展示博客(Alpha版本)

    Deadline: 2017-5-7 22:00PM,以博客发表日期为准 评分基准: 按时交 - 有分,检查的项目包括后文的四个方面 团队成员介绍 Alpha阶段进展 团队合作,各成员分工 Beta阶 ...

  4. 第二次项目冲刺(Beta阶段)5.19

    1.提供当天站立式会议照片一张 会议内容: ①新成员加入,熟悉团队. ②制定新一轮的任务计划. 2.每个人的工作 (1)工作安排 队员 今日进展 明日安排 王婧 #42文件分类改为按个人分类 #42文 ...

  5. Swing-JList用法-入门

    注:本文所有素材均来源于How to Use Lists,本文为该文章的学习笔记. JList是Swing中的列表控件,形状如下所示: 实际上,JList有3种不同的样式: 分别为HORIZONTAL ...

  6. 201521123068 《java程序设计》 第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1.MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己 ...

  7. Java第十三周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  8. java:数组操作工具类 java.util.Arrays包 主要方法详解

    Arrays类位于Java.util包下,是一个对数组操作的工具类,现将Arrays类中的方法做一个总结(JDK版本:1.6.0_34).Arrays类中的方法可以分为八类: sort(对数组排序) ...

  9. Spring - Bean的概念及其基础配置

    概述 bean说白了就是一个普通的java类的实例,我们在bean中写一些我们的业务逻辑,这些实例由Sping IoC容器管理着.在web工程中的spring配置文件中,我们用<bean/> ...

  10. 《Java从入门到放弃》JavaSE入门篇:练习——单身狗租赁系统

    今天,我们要玩个大的!!! 我们把之前使用数组做的这个单身狗系统改版成数据库版本,并且使用面向对象里面的一些简单思想.如果有不知道这个系统的看官,请跳转到目录页,然后再选择单身狗系统(数组版)先围观五 ...