yii2 checkboxlist使用及数据入库

视图表单部分

<?php $form = \yii\widgets\ActiveForm::begin() ?>
 
<?=$form->field($model,'username')->textInput() ?>
 
<?=$form->field($model,'hobby')->checkboxList(['1'=>'篮球','2'=>'足球','3'=>'游戏','4'=>'读书'])?>
 
 
<?=\yii\helpers\Html::submitButton('保存',['class'=>'btn btn-primary'])?>
 
<?php \yii\widgets\ActiveForm::end()?>

模型部分

public function beforeSave($insert) {
    if($this->hobby) {
        $this->hobby = implode(',',$this->hobby);
 
    }
    return parent::beforeSave($insert); // TODO: Change the autogenerated stub
}
 
public function afterFind() {
    $this->hobby = explode(',',$this->hobby);
    parent::afterFind();
}
yii2.0 的 多选框实现方法

第一种:
ActiveForm::checkboxList();
 优点:可以将全部数据生成多选框,自带验证

$form->field($model, 'username')->checkboxList(ArrayHelper::map($data,'id', 'customer_name'));
第二种:
ActiveForm::checkbox();
 优点:只生成一个多选框,自带验证

$form->field($model, 'username')->checkbox(ArrayHelper::map($data,'id', 'customer_name'));
第三种:
Html::activeCheckbox();

Html::activeCheckbox($model, 'username', ArrayHelper::map($data,'id', 'customer_name'));
第四种:
Html::activeCheckboxList();

Html::activeCheckboxList($model, 'username', ArrayHelper::map($data,'id', 'customer_name'));

Yii2.0中的COOKIE和SESSION用法

Yii2的Cookie主要是通过yii/web/Request和yii/web/Response进行操作的,Yii2的Session比较简单 ,直接通过/Yii::$app->session进行操作就好了。本文给大家介绍COOKIE和SESSION用法,需要的朋友参考下

1、Cookie

Yii2的Cookie主要是通过yii/web/Request和yii/web/Response进行操作的 ,通过/Yii::$app->response->getCookies()->add()添加Cookie,通过/Yii::$app->request->cookies读取Cookie.

1)添加一个Cookie

<?php
//第一种方法
$cookie= new/yii/web/Cookie();
$cookie-> name = 'smister';//cookie的名称
$cookie-> expire = time() + 3600; //存活的时间
$cookie-> httpOnly = true; //无法通过js读取cookie
$cookie-> value = 'cookieValue'; //cookie的值
Yii::$app->response->getCookies()->add($cookie);
//第二种方法
$cookie= new/yii/web/Cookie([‘name' => ‘smister',‘expire' => time() + 3600,‘httpOnly ' => true,‘value' => ‘cookieValue']);
Yii::$app->response->getCookies()->add($cookie);
?>

2) 读取一个Cookie

<?php
$cookie= Yii::$app->request->cookies;//返回一个/yii/web/Cookie对象
$cookie->get(‘smister');//直接返回Cookie的值
$cookie->getValue(‘smister'); //$cookie[‘smister'] 其实这样也是可以读取的
//判断一个Cookie是否存在
$cookie->has(‘smister');//读取Cookie的总数
$cookie->count();//$cookie->getCount();跟count一样
?>

3) 删除Cookie

<?php
$cookie= Yii::$app->request->cookies->get(‘smister');
//移除一个Cookie对象
Yii::$app->response->getCookies()->remove($cookie);
//移除所有Cookie,目前好像不太好使
Yii::$app->response->getCookies()->removeAll();
?>

4) 注意

对Cookie进行增删改时调用的response , 对Cookie读取时使用的是Request

2、Session

Yii2的Session比较简单 ,直接通过/Yii::$app->session进行操作就好了

1) 添加一个session

<?php
$session= Yii::$app->session;
$session->set('smister_name', 'myname');
$session->set('smister_array',[1,2,3]);
?>

2) 读取一个session

<?php
$session= Yii::$app->session;
//读取一个Session
$session->get('smister_name);
?>

3) 删除Session

<?php
$session= /Yii::$app->session;
//删除一个session
$session->remove(‘smister_name');
//删除所有session
$session->removeAll();
?>

调用Yii::getAlias与Yii::setAlias的用法

别名用来表示文件路径和URL,简化引用,避免在代码中编码一些绝对路径和URL。一个别名必须以‘@’字符开头,以区别于传统的文件路径和URL。
定义别名:调用Yii::setAlias()给文件路径或URL定义别名:
// 文件路径的别名
Yii::setAlias(‘@foo’, ‘/path/to/foo’);
// URL 的别名
Yii::setAlias(‘@bar’, ‘http://www.example.com’);
注意:别名所指向的文件路径或 URL 不一定是真实存在的文件或资源。
可以通过在一个别名后面加斜杠 / 和一至多个路径分段生成新别名(无需调用 Yii::setAlias())。我们把通过 Yii::setAlias() 定义的别名称为根别名,而用他们衍生出去的别名成为衍生别名。例如,@foo 就是根别名,而 @foo/bar/file.php 是一个衍生别名。
你还可以用别名去定义新别名(根别名与衍生别名均可):
Yii::setAlias(‘@foobar’, ‘@foo/bar’);
解析别名:调用Yii::getAlias解析别名到对应的文件路径或URL:如
// echo Yii::getAlias(‘@webroot’); // D:/path/yiibasic/web
// echo Yii::getAlias(‘@app’); // D:\path\yiibasic
// echo Yii::getAlias(‘@web’); // /yiibasic/web
注意:Yii::getAlias() 并不检查结果路径/URL 所指向的资源是否真实存在。
系统定义的路径别名:
@yii – BaseYii.php 文件所在的目录(也被称为框架安装目录)
@app – 当前运行的应用程序的基本路径 yii\base\Application::basePath
@common – 公共文件目录
@frontend – 前端web应用程序目录
@backend – 后端web应用程序目录
@console – 控制台目录
@runtime – 当前运行的应用的 yii\base\Application::runtimePath
@vendor – yii\base\Application::vendorPath
@webroot – 当前运行应用的 Web 入口目录
@web – 当前运行应用的根 URL

YII2 where查询条件整理

本文转自:https://www.yiichina.com/tutorial/1405

官方文档:http://www.yiichina.com/doc/guide/2.0/db-query-builder

文章涉及where、 addParams 、filterWhere 、andWhere、orWhere、 andFilterWhere()、 orFilterWhere()、andFilterCompare()
但是格式是一样的

字符串格式,例如:'status=1'
哈希格式,例如: ['status' => 1, 'type' => 2]
操作符格式,例如:['like', 'name', 'test']

字符串和哈希格式很好理解,我们来看看操作符格式,因为操作符格式可以组成相对复杂的查询语句
最简单的就是官方给的例子

$status = 10;
$search = 'yii';

$query->where(['status' => $status]);

if (!empty($search)) {
    $query->andWhere(['like', 'title', $search]);
}
生成的语句就是
... WHERE (`status` = 10) AND (`title` LIKE '%yii%')

操作符格式

[操作符, 操作数1, 操作数2, ...]
0cb4d39e-418f-4183-a900-8a4ab5b1aadf.png

第一个参数是操作符
操作符包括and、or、 like、in、 between等
第二个第三个都是操作数

第一种最简单的就是上面提到的例子
 andWhere(['like', 'title','搜索的标题']);
生成的语句
... WHERE (`status` = 10) AND (`title` LIKE '%yii%')
第二种
addWhere(['and', 'id=1', 'name=2']);
生成的语句
... WHERE id=1 AND name=2
第三种
addWhere(['and', 'type=1', ['or', 'id=1', 'id=2']]);
生成的语句
... WHERE type=1 AND (id=1 OR id=2);
第四种
->andWhere(['or like','name',['哈哈','苦苦']]);
生成的语句
 WHERE `name` LIKE '%哈哈%' OR `name` LIKE '%苦苦%';
 第五种
 addWhere(['or',['like','name','哈哈'],['like','title','苦苦']]);//操作符格式的嵌套
 生成的语句
... WHERE (`status`=1) AND ((`name` LIKE '%哈哈%') OR (`title` LIKE '%苦苦%'))

$query->andWhere(new Expression(‘FIND_IN_SET(‘1,size’)’));+
生成的语句
… WHERE id=1 AND FIND_IN_SET(1, size)
//size的值:1,2,3,4,5

yii2记数,自动累加

文章一般都有统计浏览次数的需求,一般小型项目的做法就是直接 update 数据库中的某个字段。在 Yii 中怎么实现呢?请往下看:

实现

方式一

Yii2 中有这个 updateAllCounters 静态方法,这种方式是最快并且最省事的实现方式,代码示例如下:

Topic::updateAllCounters(['view_count' => 1], ['id' => $id]);// 实现的效果就是 view_count + 1,1根据你的需求可以是正数也可以是负数。

如果你的条件比较复杂你可以这样写:

Topic::updateAllCounters(['view_count' => 1], ['and', ['xxx' => 0, 'yyy' => 2], ['>', 'zzz', $time]);

如果你现在的需求是:更新一个字段的值,一个字段的值 +1,你可以试着用这种方式去实现:

 Topic::updateAll(    ['view_count' => new Expression('`view_count` + 1'), 'updated_at' => time()],    ['id' => $id]);

PS:此处的 view_count 字段默认值切记不能设置为 null

Expression 是表达式的意思,可以实现更多特殊 SQL,想了解更多,可以去搜索一下文档。

方式二

当然你还可以这样去实现:

$model = Post::findOne($id);$model->updateCounters(['view_count' => 1]);

yii2 swift mailer 发送邮件不成功的问题

今天调试yii2自带的swift mailer发邮件,开始调试时,发送用的send()方法始终返回true,但是就是没有收到邮件,很是纳闷,于是开始了半个晚上的调试之旅,我把调试过程发出来,希望后面的小伙伴能少走一些弯路。
首先,根据热心网友的文章,配置邮箱的基础信息,我用的base项目,所以我的配置文件是web.php,配置内容为:
        ‘mailer’ => [
            ‘class’ => ‘yii\swiftmailer\Mailer’,
            ‘transport’ => [
                ‘class’ => ‘Swift_SmtpTransport’,
                ‘host’ => ‘smtp.163.com’,
                ‘username’ => ‘xxx@163.com’,
                ‘password’ => ‘xxx’,
                ‘port’ => ’25’,
                ‘encryption’ => ‘tls’,//    tls | ssl

            ],
            ‘messageConfig’=>[
                ‘charset’=>’UTF-8’,
                ‘from’=>[‘xxx@163.com’=>’admin’]
            ],
            ‘useFileTransport’ => false,
        ],
然后开始写了一个测试用的控制器,内容如下:
    public function actionMailer()
    {
        $mail= Yii::$app->mailer->compose();
        $mail->setTo(‘10000@qq.com’);
        $mail->setSubject(“Test title”);
        $mail->setTextBody(‘Test content’);
        //$mail->setHtmlBody(“Test HTML”);
        var_dump($mail->send());
    }
好了,信心满满的开始测试了,执行链接,满心欢喜的去查看QQ邮箱了,但是左等右等,前等后等,丫的就是没有,重新发送,还是没有,但是send()的返回值明明就是true!
 于是开始排错,总结了一下,出错的可能位置在以下几点:
 不同邮箱的host是不同的
如果是163邮箱,password是授权码
userFileTransport要设置成false,否则只会在runtime下生成缓存文件,不会真正发送
一一排查,确信没有错误,太奇怪了,于是我决定直接调用swiftmailer试一下,于是新建了下面的控制器:
    public function actionMailer2()
    {
        $mailer = new \yii\swiftmailer\Mailer();
        $mailer->transport=[
            ‘class’ => ‘Swift_SmtpTransport’,
            ‘host’ => ‘smtp.163.com’,
            ‘username’ => ‘xxxx@163.com’,
            ‘password’ => ‘xxxx’,
            ‘port’ => ’25’,
            ‘encryption’ => ‘tls’,//    tls | ssl
        ];
        $mailer->messageConfig=[
            ‘charset’=>’UTF-8’,
            ‘from’=>[‘xxxx@163.com’=>’admin’]
        ];
        $mailer->useFileTransport = false;
        $mail= $mailer->compose();
        $mail->setTo(‘10000@qq.com’);
        $mail->setSubject(“Test title”);
        $mail->setTextBody(‘Test content’);
        var_dump($mail->send());
    }

哎哟我去!发送成功了!这是为啥呢?首先证明这个类确是是可以发送邮件的了,那么下一步要细细的分析这两段代码区别在何处了。
我分别打印了两个类构造完成后的结果:
    public function actionMailer()
    {
        echo ‘<pre>’;
        var_dump(Yii::$app->mailer);
    }

    public function actionMailer2()
    {
        $mailer = new \yii\swiftmailer\Mailer();
        $mailer->transport=[
            ‘class’ => ‘Swift_SmtpTransport’,
            ‘host’ => ‘smtp.163.com’,
            ‘username’ => ‘xxxx@163.com’,
            ‘password’ => ‘xxxx’,
            ‘port’ => ’25’,
            ‘encryption’ => ‘tls’,//    tls | ssl
        ];
        $mailer->messageConfig=[
            ‘charset’=>’UTF-8’,
            ‘from’=>[‘xxxx@163.com’=>’admin’]
        ];
        $mailer->useFileTransport = false;
        echo ‘<pre>’;
        var_dump($mailer);
    }

在长长的内容中慢慢的对比,终于发现了端倪,
第一个方法中:[“useFileTransport”]=>bool(true)
第二个方法中:[“useFileTransport”]=>bool(false)
上面也说过了,useFileTransport必须设置成false才能发送成功,那问题总算是找到了,那为什么会出现这样的问题呢?我上面明明是设置过的,为什么没生效?难道是测试环境的原因吗?
我测试使用的url是http://goonwin.com/index-test.php?r=liyang/mailer,注意那个index-test.php,就是他的原因了,于是我把index-test.php改成index.php立马发送成功了,丫的,这么隐蔽一个坑啊!!!
但是我还是希望测试环境可以发送邮件的,于是,稍微改动了一下调用的方法:
    public function actionMailer()
    {
        $mail = Yii::$app->mailer;
        $mail->useFileTransport = false;
        $mail= $mail->compose();
        $mail->setTo(‘10000@qq.com’);
        $mail->setSubject(“Test title”);
        $mail->setTextBody(‘Test content’);
        var_dump($mail->send());
    }

Oh,终于可以发送了,看到论坛中有些朋友也在问同样的问题,估计现在你已经可以解决了。洋洋洒洒写了这么多,其实就一个目的,希望能给新手一点调试的经验吧,老手你当然乐呵乐呵就得了。
浪费一晚上青春,睡觉!

Yii2.0实现的批量更新及批量插入功能示例

本文实例讲述了Yii2.0实现的批量更新及批量插入功能。分享给大家供大家参考,具体如下:

批量更新

方法1

/**
* 批量更新循环周期
* @param array $condition
* $condition = ['advertise_id' => '','status' => '', 'weekdays'=>[1,2,3]] 查询条件
* $params = ['status' => '']
* @param $params
* @return bool
*/
public function batchUpdateAdSchedule($condition = [], $params)
{
  if (count($condition) == 0 || !is_array($condition) || count($params) == 0) {
    return false;
  }
  $conditions = ' 1 = 1 ';
  $bind = [];
  if (array_key_exists('advertise_id', $condition) && !empty($condition['advertise_id'])) {
    $conditions .= ' AND `advertise_id` = :advertiseId';
    $bind['advertiseId'] = $condition['advertise_id'];
  }
  if (array_key_exists('status', $condition) && !empty($condition['status'])) {
    $conditions .= ' AND `status` = :status';
    $bind['status'] = $condition['status'];
  }
  $result = AdvertiseSchedule::updateAll($params, $conditions, $bind);
  return $result > 0 ? true : false;
}

方法2

/**
* 批量更新商品销量
* @param $params
* @return bool|int
* @throws \yii\db\Exception
*/
public function batchUpdateSalesNum($params)
{
  if (count($params) == 0 || !is_array($params)) {
    return false;
  }
  $sql = '';
  foreach ($params as $key => $value) {
    $sql .= 'UPDATE `morefun`.`mbb_goods` SET `sale_num` = `sale_num` -' . $value['amount'] . ' WHERE `id` =' . $value['goods_id'] . ';';
  }
  $result = Yii::$app->db->createCommand($sql)->execute();
  return $result == 1 ? true : false;
}

批量插入

/**
* 批量插入
* @param $params
* @return int
* @throws \yii\db\Exception
*/
public function batchAddShopClassConn($params)
{
  $connection = Yii::$app->db;
  $queryBuilder = $connection->queryBuilder;
  /*$sql = $queryBuilder->batchInsert('user', ['name', 'age'], [
    ['Tom', 30],
    ['Jane', 20],
    ['Linda', 25],
  ]);*/
  $sql = $queryBuilder->batchInsert(shopClassConn::tableName(),
    ['shop_id', 'class_id'], $params);
  return $connection->createCommand($sql)->execute();
}

关于上一页与下一页实现细节

我想要把题库设计一下翻页功能,Mysql语句也很简单,在本地测试一点问题都没有,但是一放到服务器上便提示内存资源耗竭,最后在查看了一些资料后,在后面加了一个limit 1,如此便跑得飞快:

实现代码:

    public static function PrevQuestion($id,$uid=null,$testpaper=null)
    {
        $query = Question::find()->where(['<','id',$id]);

        if($uid)
        {
            $query->andWhere(['author'=>$uid]);
        }

        if($paper)
        {
            $query->LeftJoin('sq_testpaperinfo t','t.paper_id='.$paper_id);
        }

        $query->orderBy('id DESC');

        $query->limit(1);

        return $query->one();
    }

    public static function NextQuestion($id,$uid=null,$testpaper=null)
    {
        $query = Question::find()->where(['>','id',$id]);

        if($uid)
        {
            $query->andWhere(['author'=>$uid]);
        }

        if($paper)
        {
            $query->LeftJoin('sq_testpaperinfo t','t.paper_id='.$paper_id);
        }

        $query->orderBy('id DESC');
        $query->limit(1);

        return $query->one();
    }

下面是参考内容:

/**
* 获取当前记录的上一条记录
* @param seq
* @return
*/
@Select("select title, random_code from tb_blog where seq < ${seq} order by seq desc limit 1 ")
public Map<String,Object> getPreviousBlog(@Param("seq") long seq);

/**
* 获取当前记录的下一条记录
* @param seq
* @return
*/
@Select("select title, random_code from tb_blog where seq > ${seq} order by seq asc limit 1 ")
public Map<String,Object> getPostBlog(@Param("seq") long seq);

seq 是自增序列,random_code是id,title是博客标题。

seq不是主键,要使seq自增,先添加seq字段或建表时创建,再将seq添加unique索引,再使seq auto_increment,因为自增长列必须先是unique key或primary key。

使用phpword获取doc中的表格数据

1. 首先确定使用phpword是可以读取word文档中表格里面的数据, 使用的phpword版本0.17.0

1composer require "phpoffice/phpword"

2.关键词及包含原理 (这里只做简单概述)

本人做博文喜欢直接贴代码,直接用。可这个不太行啊,因为输入不统一,word格式样式太多,输出也不统一,有的要输出数据,有的要输出word或者html,所以这里就追一下原理(可能不严谨但是便于理解)

关键词

section(部分) : phpword中将word文档分为若干个section(部分)

element(元素) : 每个section包含若干个element(元素)、文本、图片,元素分为文本元素、表格元素、其他(未涉及不做讨论)

textRun(文本元素) : 每个文本集合包含多个文本

text(文本) : 为字符或者图片

table(表格元素) : 每个表格元素包含多个行 row

row(行) : 每个行包含多个列 cell

cell(列) : 每个列包含多个textRun(文本元素) 这里没错,就是包含多个文本元素(表格元素也可以但是没人在word表格的某一个格里再来一个表格吧)

各个节点之间的关系图

3.代码实现(本地测试已通)

<?php
/**
 * Created by PhpStorm.
 * User: parker
 * Date: 2020/10/18
 * Time: 16:09
 */

namespace common\services;


class WordService extends BaseService
{

    public static function importWord($info)
    {
        $word  = self::getWord($info['path']);
        dd($word);
    }

    /**
     * 获取word文档内容
     * @param string $path
     * @return array
     */
    public static function getWord($path = '')
    {
        //加载word文档,使用phpword处理
        $phpWord = \PhpOffice\PhpWord\IOFactory::load($path);
        return self::getNodeContent($phpWord);
    }

    /**
     * 根据word主节点获取分节点内容
     * @param $word
     * @return array
     */
    public static function getNodeContent($word)
    {
        $return = [];
        //分解部分
        foreach ($word->getSections() as $section)
        {
            if ($section instanceof \PhpOffice\PhpWord\Element\Section) {
                //分解元素
                foreach ($section->getElements() as $element)
                {
                    //文本元素
                    if ($element instanceof \PhpOffice\PhpWord\Element\TextRun) {
                        $text = '';
                        foreach ($element->getElements() as $ele) {
                            $text .= self::getTextNode($ele);
                        }
                        $return[] = $text;
                    }
                    //表格元素
                    else if ($element instanceof \PhpOffice\PhpWord\Element\Table) {
                        foreach ($element->getRows() as $ele)
                        {
                            $return[] = self::getTableNode($ele);
                        }
                    }
                }
            }
        }
        return $return;
    }

    /**
     * 获取文档节点内容
     * @param $node
     * @return string
     */
    public static function getTextNode($node)
    {
        $return = '';
        //处理文本
        if ($node instanceof \PhpOffice\PhpWord\Element\Text)
        {
            $return .= $node->getText();
        }
        //处理图片
        else if ($node instanceof \PhpOffice\PhpWord\Element\Image)
        {
            $return .= self::pic2text($node);
        }
        //处理文本元素
        else if ($node instanceof \PhpOffice\PhpWord\Element\TextRun) {
            foreach ($node->getElements() as $ele) {
                $return .= self::getTextNode($ele);
            }
        }
        return $return;
    }

    /**
     * 获取表格节点内容
     * @param $node
     * @return string
     */
    public static function getTableNode($node)
    {
        $return = '';
        //处理行
        if ($node instanceof \PhpOffice\PhpWord\Element\Row) {
            foreach ($node->getCells() as $ele)
            {
                $return .= self::getTableNode($ele);
            }
        }
        //处理列
        else if ($node instanceof \PhpOffice\PhpWord\Element\Cell) {
            foreach ($node->getElements() as $ele)
            {
                $return .= self::getTextNode($ele);
            }
        }
        return $return;
    }

    /**
     * 处理word文档中base64格式图片
     * @param $node
     * @return string
     */
    public static function pic2text($node)
    {
        //获取图片编码
        $imageData = $node->getImageStringData(true);
        //添加图片html显示标头
        $imageData = 'data:' . $node->getImageType() . ';base64,' . $imageData;
        $return = '<img src="'.$imageData.'">';
        return $return;
    }
    /**
     * 处理word文档中base64格式图片
     * @param $node
     * @return string
     */
    public static function pic2file($node)
    {
        //图片地址(一般为word文档地址+在word中的锚点位置)
        $imageSrc  = 'images/' . md5($node->getSource()) . '.' . $node->getImageExtension();
        $imageData = $node->getImageStringData(true);
        //将图片保存在本地
        file_put_contents($imageSrc, base64_decode($imageData));
        return $imageSrc;
    }

    /**
     * 将word转化为html(转换存储html文件后展示)
     * @param $path
     * @throws \PhpOffice\PhpWord\Exception\Exception
     */
    public static function word2html($path)
    {
        $phpWord = FileImportService::getOne($path);
        //转为html处理
        $xmlWriter  = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, "HTML");
        $path = pathinfo($path);
        $fileName = $path['dirname'] . '/' . $path['filename'] . '.html';
        $xmlWriter->save($fileName);
        $html = file_get_contents($fileName);
        echo $html;
        die;

    }


}

关于word模板导入中OLEObject的二进制文件转图片的方法

很久以前就想要做这个事情,但时间不允许,当然更多的是技术不行,总期待着有现成的解决方案,当然现成的PHPWord可以解决很多事情,但还是遇到的新的问题,如下:

【题文】1.集合<Object: word/embeddings/oleObject1.bin>,<Object: word/embeddings/oleObject2.bin>,则<Object: word/embeddings/oleObject3.bin>( )。A、<Object: word/embeddings/oleObject4.bin>B、<Object: word/embeddings/oleObject5.bin>C、<Object: word/embeddings/oleObject6.bin>D、<Object: word/embeddings/oleObject7.bin>【答案】B【解析】∵<Object: word/embeddings/oleObject8.bin>,∴<Object: word/embeddings/oleObject9.bin>,∵<Object: word/embeddings/oleObject10.bin>,故选B。【结束】

上面是读取word的一种情形,所以就考虑把word文档中的公式都变成图片。

下面是探寻到的方法:

第一步:把word保存为html格式

第二步:用word(或WPS)重新打开html文件,并保存为docx格式文件

经过上面两步就实现了利用Mathtype等公式编辑器编辑的公式转图片的效果,非常好,现在可以读取了,但新的问题又来了,有些公式是利用word直接插入的公式,现在已经变形了!!!,呜呜呜……


今天查寻资料得知应该可能使用Apache POI解决这个文件读取的问题,但可惜是基于java的

地址:https://blog.csdn.net/qianhuan_/article/details/110197907