是相同慢基于PHP+MYSQL开发之中文内容管理框架。ThinkCMF提出灵活的利用机制,框架自身提供基础的田间管理作用,而开发者可以依据自身之要求为用的款式展开扩张。每个应用都能独立的做到好的任务,也可经系统调用其他使用进行协同工作。在这种运行机制下,开发市场以的用户无论需关注开发SNS应用时怎样工作的,但他们中间又只是经网自进行和谐,大大的下降了开发成本和维系成本。

一律步一步按需导出

由于这个效果以查询出来的数据量很挺待单独抽离出来(不克坐公司之系及),所以自己就算新建了一个控制台应用程序,简单的做了一个导出Excel的功能,因为刚刚开需要没有要求要联合单元格,所以我顿时边就很快的开下了:核心代码如下:

ExportToExcelByNOPI(dt, GetOriginColumns(dt), $"2016年度成本费用统计.xlsx"));
private void DataTableToExcel(DataTable dt, string[] titles, string file)
{
    using (FileStream fs = new FileStream(file, FileMode.OpenOrCreate))
    using (StreamWriter sw = new StreamWriter(new BufferedStream(fs), Encoding.Default))
    {
        string title = "";
        //拼接表头
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            title += titles[i] + "\t";//自动跳到下一单元格
        }
        title = title.Substring(0, title.Length - 1) + "\n";
        sw.Write(title);

        foreach (DataRow row in dt.Rows)
        {
            string line = "";
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                //line += row[i].ToString().Trim() + "\t"; //内容:自动跳到下一单元格
                line += row[i].ToString().Trim() + "\t";//自动跳到下一单元格
            }
            line = line.Substring(0, line.Length - 1) + "\n";
            sw.Write(line);
        }
    }
}

将导出的excel发过去发觉向不入他们的要求,说只要对准什么样行统一单元格,这样方便他们数据解析,这样的话就得NPOI上场了;刚开头想方设法特别简短,只要他们之值等,我不怕把他联合单元格,毕竟像订单号是绝无仅有的呢,那么订单号所附带的比方订单重量,数量相等还是平之(其实要想的极自然了,导致了后面的一模一样多重之题目)

private void ExportToExcelByNOPI(DataTable dt, string title, string strFilename)
{
    if ((dt == null) || string.IsNullOrEmpty(strFilename))
    {
        return;
    }
    if (File.Exists(strFilename))
    {
        File.Delete(strFilename);
    }
    //添加表头
    for (int i = 0; i < dt.Columns.Count; i++)
    {
        ICell cell = headerrow.CreateCell(i);
        cell.CellStyle = style;
        cell.SetCellValue(dt.Columns[i].ColumnName);
    }
    //添加第一行数据
    IRow row = sheet.CreateRow(1);
    for (int j = 0; j < dt.Columns.Count; j++)
    {
        string cellText = dt.Rows[0][j].ToString();
        row.CreateCell(j).SetCellValue(cellText);
    }
    //从第二行开始循环,和上一行进行判断,如果相同,则合并
    for (int i = 1; i < dt.Rows.Count; i++)
    {
        row = sheet.CreateRow(i + 1);
        for (int j = 0; j < dt.Columns.Count; j++)
        {
            string cellText = dt.Rows[i][j].ToString();
            row.CreateCell(j).SetCellValue(cellText);
            string temp = dt.Rows[i - 1][j].ToString();
            //这里是合并单元格条件判断,如值是否相等,是否在合并列要求之内
            if (!string.IsNullOrEmpty(temp) && cellText== temp && ColumnsName.Contains(dt.Columns[j].ColumnName))
            {
                CellRangeAddress region = new CellRangeAddress(i, i+1, j, j);
                sheet.AddMergedRegion(region);
            }
        }
    }
    style.Alignment = HorizontalAlignment.Center;
    style.VerticalAlignment = VerticalAlignment.Center;
    style.Alignment = HorizontalAlignment.Center;//居中显示
    using (FileStream fs = new FileStream(strFilename, FileMode.Open, FileAccess.ReadWrite))
    using (MemoryStream ms = new MemoryStream())
    {
        workbook.Write(ms);
        var buf = ms.ToArray();
        fs.Write(buf, 0, buf.Length);
        fs.Flush();
    }
}

传出来发现Excel里面合并之后的始末不对了,有的合并单元格不对(比如订单号是01,有少数只活P1,P2,这就算闹个别履,如果立刻片执订单号是平之,则仍需要是设联合的,但是其他列的值有的集合多了,稍微一细心思就理解原委了,我只是独自的较上一行和生一行的列值,那么下一行的别样订单的产品信息如果条件,值相同的语也会见被统一,这虽非入我们的要求了,所以还得在是基础之上在给定限制条件;

坐此发明是都订单也保障的,那么我们即便盖这列为参照合并规则来记录这排被联合的行数,然后我们标记是行数记为sameCount,那么每列的价我们都见面比较,如果以sameCount行列值相同,则统一;那么即使得勾个帮扶类CellCalculateHelper来计算出要求受统一之排于sameCount行值是否还一模一样:

internal class CellCalculateHelper
{
    /// <summary>
    /// 从startRow行开始比较相同订单号的行数
    /// </summary>
    internal static (int startRow, int sameCount) GetRepeaterCount(int startRow, DataTable dt)
    {
        var i = startRow;
        var sameCount = 0;
        while (dt.Rows[startRow][0].ToString() == dt.Rows[i][0].ToString())
        {
            if ((i + 1) == dt.Rows.Count) break;
            sameCount++;
            i++;
        }
        return (startRow, sameCount);
    }

    internal static bool IsMergeRegionMaxRepeatCount(DataTable dt, string columnName, int startRow, int sameCount)
    {
        var start = startRow + sameCount - 1;
        while (sameCount - 1 != 0)
        {
            if (dt.Rows[start][columnName].ToString() == dt.Rows[start - 1][columnName].ToString()){
                start = start - 1;
                sameCount--;
            }else{
                return false;
            }
        }
        return true;
    }
}

有矣这个帮忙类似,就哼惩治了,改造方面的ExportToExcelByNOPI方法如下:

private void ExportToExcelByNOPI(DataTable dt, string title, string strFilename)
{
    ...
    //添加第一行数据这样上面代码相同
    //记住第一行相同的最大行数
    var tuple = CellCalculateHelper.GetRepeaterCount(0, dt);
    //第一行数据遍历
    for (int i = 0; i < dt.Rows.Count; i++){
        IRow row = sheet.CreateRow(i + 1);
        //如果当前行数等于最大相同的函数(相当于合并之后的下一行数据,必定与上一行数据不同)
        if (i == tuple.startRow + tuple.sameCount){
            tuple = CellCalculateHelper.GetRepeaterCount(i, dt);
        }
        //遍历列
        for (int j = 0; j < dt.Columns.Count; j++){
            string cellText = dt.Rows[i][j].ToString();
            row.CreateCell(j).SetCellValue(cellText);
            if (tuple.sameCount > 1){
                //需要合并
                string tempValue = dt.Rows[i][j].ToString();
                //指定列合并单元格
                if (!string.IsNullOrWhiteSpace(tempValue) && 
                    cellText == tempValue && 
                    ColumnsName.Contains(dt.Columns[j].ColumnName)){
                        //判断是否是参照行DDNO
                        if (i >= tuple.startRow + tuple.sameCount - 1) continue;
                        if ((ColumnsName[0] == dt.Columns[j].ColumnName)){
                            //下一行与上一行合并
                            CellRangeAddress region = new CellRangeAddress(i + 1, i + 2, j, j);
                            sheet.AddMergedRegion(region);
                        }else{
                            //判断该列的最大sameCount行值是否相同,如果不同,不合并;相同则合并
                            if (CellCalculateHelper.IsMergeRegionMaxRepeatCount(dt, dt.Columns[j].ColumnName, i, tuple.sameCount)){
                                CellRangeAddress region = new CellRangeAddress(i + 1, i + 2, j, j);
                                sheet.AddMergedRegion(region);
                            }
                        }
                }
            }
        }
    }
    ...
    ...
}

诸如此类导出来的多寡就是是符合业务同事的渴求了!

  • 增页面管理增加模板选择功能
  • agirl模板增加触摸左滑侧导航
  • 多文章图集功能
  • 加微信公众号管理使用
  • 搭用户注册邮箱激活支持
  • 增加第三正在账号权限控制

后记

写到这里看这些还是一帆风顺的为?

NO!

本人吃坑在一个想不到的地方,至今自己也未尝悟出原因:期初,我是因此控制台应用程序想大概的导出excel的,也测试了于数据库查出一个供应商的装有订单信息导出excel是尚未问题的,于是当自己询问有装有的供应商之时段,bug出现了,程序运行一段时间后毫无反应了(并无是死机,也从来不报内存溢出的左),因为数据量很十分,所以就自家还同个煞笔似的在那里当了,等自我吃得了中饭赶回发现还是没有成导出,我就是意识及无对了,但是未报任何异常,我有史以来查无顶问题现在那,我随即尝试换种写法导出excel——分页,以及分批次导出不同之excel;这种是得的,到当下自衷心就知道估计是内存问题了,最后自己把所有控制台项目转移成类库,然后新建web应用程序能平等涂鸦运行成功,更加被我坚信是内存问题,但是为什么控制台应用程序不见面报内存溢出底错呢?这个自家实在无从查起什么,有情侣了解,希望能告我

http://www.onethink.cn/

2017年12月29日修补:

前方修改之后还是不对,由于数据量太要命,我当羁押了前方片的数码尚未问题因纵OK,实际上问题或于强烈的,就是当起2独以上同等的数据列时,合并单元格就会见发生问题,原来我眷恋的凡H1,H2合并成H21,然后继续循环H3,接着合并,我以为H21跟H3合并会成一个当Excel中三行一列成的联合单元格,但是结果发现是H3与H4合并后于同H21拼接的一定量独2行1排列的独元格,这就生好题目,后来自己哪怕将合并单元格条件有修正如下,便到了。代码如下:

//判断是否是参照行OrdNO
if (i > tuple.startRow + tuple.sameCount - 1) continue;
//新增的i == tuple.startRow 是为了防止多次合并
if ((ColumnsName[0] == sourceTable.Columns[j].ColumnName) && i == tuple.startRow)
{
    //startRow与startRow+sameCount行合并(也就是一次性合并相同行数单元格)
    CellRangeAddress region = new CellRangeAddress(tuple.startRow + 1, tuple.startRow + tuple.sameCount, j, j);
    sheet.AddMergedRegion(region);
}else
{
    if (CellCalculateHelper.IsMergeRegionMaxRepeatCount(sourceTable, sourceTable.Columns[j].ColumnName, tuple.startRow, tuple.sameCount) && i == tuple.startRow)
    {
        CellRangeAddress region = new CellRangeAddress(tuple.startRow + 1, tuple.startRow + tuple.sameCount, j, j);
        sheet.AddMergedRegion(region);
    }
}

ThinkCMF

NPOI导出Excel及用问题

盖近来供销社质管部门提出了一个统计报表的需求:要求导出一个2016及2017东深圳区域之兼具供应商之花费成本计算——一个22排的Excel表,其中还包多列的联结单元格;说实话,统计报表功能实在自己或很少提到的,以前都是一直用DataTable+输出流导出Excel,因为涉嫌到统一单元格,明显于是输出流就非合适了,此时NPOI开源框架就大得体了;当然还发出其他零件可以选取,比如EPPlush,微软由带组件,以及收费的Aspose.Cells;因为NPOI材料比多都公司因此之机件为是以此,所以便分选它了;

8. 安全稳健:供稳健的安全策略,包括备份恢复、容错、防止恶意抨击登录,网页防篡改等大多项安全保管作用,保证系统安全,可靠、稳定之运行。

运作环境,要求PHP在5.3以上为支撑称空间。

代码遵循Apache2开源协议,免费使用,对商业用户为不论其他限制。

6. 云端部署:经叫之点子可以轻松支持平台的布置,让你的网站无缝迁移,内置已经支撑SAE。

9. 行使仓库:官应用仓库有大量来第三方插件与以模块、模板主题,有很多源开源社区的贡献,让您的网站“One”美无缺。

V1.1.0增加

http://www.thinkcmf.com/

 

V1.1.0修复

一般而言的CMS(内容管理体系)一般不克不辱使命具有的急需,而为CMS在ThinkCMF内部只是已一个采用的款式存在,所以利用ThinkCMF你得据此CMS来治本而的情,用电影网站体系来保管视频,用电商系统来管理电商网站。这些程序不会见潜移默化,你可模块化的多或者调减使用。

OneThink是TP团队官方出品。

5. 用户作为:支撑自定义用户作为,可以对单个用户要群体用户之一言一行展开记录和享受,为你的营业决策提供实惠参考数据。

借设有这样一个命题:需要针对一个早就产生网开展移植,有无发什么系统是可用来当开展高效移植的基础的。能解决每个系统的基本问题,只待考虑有关工作逻辑问题。

4. 从头源免费:OneThink以Apache2开源协议,免费提供利用。

2. 模块化:崭新的架和模块化的付出机制,便于灵活扩展和二次开发。

7. 云服务支持:将要启动支持出口存储、云安全、云过滤和云统计等服务,更多密切的服务为你的网站还欣慰。

OneThink特性介绍:

1. 基于ThinkPHP新式版本Thinkphp3.2

ThinkCMF自身层次非常清晰,逻辑吗一定之小心谨慎,特别是系自带的protal应用非常适合PHP初学者用。采用了国内优秀之开源php框架ThinkPHP使得ThinkCMF具备了良好的性能及可以的安全性。

  • 修补消除缓存bug
  • 修补服务器magic_quotes_gpc开起时,后台数据保存时反复转义bug
  • 修复后台菜单开关按钮,图标不动态切换bug
  • 后台支持多主题功能
  • 修复角色禁止后依然能够登陆bug
  • 修复后台角色授权时,层级选择bug;
  • 注销后台编辑器图片及传高宽限制
  • 修补后台缩略图上传Not Found错误
  • 优化后台登录方式
  • 优化后台数据不变动时提醒错误
  • 优化后台菜单管理,和权杖管理
  • 优化安装逻辑,install可以去
  • 优化后台刷新按钮为刷新时页

 

3. 文档模型/分类体系:由此与文档模型绑定,以及不同的文档类型,不同分类可以兑现差异化的功力统计,轻松实现诸如资讯、下载、讨论与图等功效。