SQLiteDataBase数据库

XML界面设计  
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="姓名:" />

        <EditText
            android:id="@+id/etc_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="50px" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="班级:" />

        <EditText
            android:id="@+id/etc_class"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="50px" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="学号:" />

        <EditText
            android:id="@+id/etc_id"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="50px" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btn_add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="添加数据"
            android:textAlignment="center" />

        <Button
            android:id="@+id/btn_show"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="全部显示"
            android:textAlignment="center" />

        <Button
            android:id="@+id/btn_clr"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="清除数据"
            android:textAlignment="center" />

        <Button
            android:id="@+id/btn_del"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="全部删除"
            android:textAlignment="center" />
    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="ID:" />

        <EditText
            android:id="@+id/etc_id2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="2" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/btn_del_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="ID删除"
            android:textAlignment="center" />
        <Button
            android:id="@+id/btn_show_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="ID查询"
            android:textAlignment="center" />
        <Button
            android:id="@+id/btn_update_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="ID更新"
            android:textAlignment="center" />
    </LinearLayout>

    <TextView
        android:id="@+id/txt_end"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="" />

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>
People.java
package com.example.exp6;

public class People {
    public int ID = -1;
    public String Name;
    public String Class;
    public String Number;

    //重载toString方法  返回值String类型
    @Override
    public String toString(){
        String result = "";
        result += "ID:" + this.ID + ",";
        result += "姓名:" + this.Name + ",";
        result += "班级:" + this.Class + ", ";
        result += "学号:" + this.Number;
        return result;
    }
}
 DBAdapter.java
package com.example.exp6;
import android.annotation.SuppressLint;
import android.content.*;
import android.database.Cursor;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

//对数据库进行操作的类
public class DBAdapter {
    private static final String DB_NAME = "student.db";   //数据库名称
    private static final String DB_TABLE = "peopleinfo";  //表名
    private static final int DB_VERSION = 1;              //数据库版本
    public static final String KEY_ID = "_id";            //数据库表的属性名称
    public static final String KEY_NAME = "name";
    public static final String KEY_CLASS = "class";
    public static final String KEY_NUMBER = "number";

    private SQLiteDatabase db;              //数据库的实例db
    private final Context context;          //Context的实例化
    private DBOpenHelper dbOpenHelper;      //帮助类的实例化 dbOpenHelper

    //内部类:对帮助类 构建
    //继承SQLiteOpenHelper
    //必须重载onCreate和onUpgrade方法
    private static class DBOpenHelper extends SQLiteOpenHelper {
        //帮助类的构造函数 -- 4个参数
        //Code -> SQLiteOpenHelper 即可成功插入该构造函数
        public DBOpenHelper(@Nullable Context context, @Nullable String name,
                            SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        //static常量字符串--创建表的 sql 命令
        //create table peopleinfo("id integer primary key autoincrement,name text not null,
        // class text not null,number text not null")
        private static final String DB_CREATE = "create table " +
                DB_TABLE + " (" + KEY_ID + " integer primary key autoincrement, " +
                KEY_NAME + " text not null, " + KEY_CLASS + " text not null," +
                KEY_NUMBER + " text not null);";
        //重载帮助类onCreate方法
        //1个参数SQLiteDatabase类型
        @Override
        public void onCreate(SQLiteDatabase sqLiteDatabase) {
            //execSQL()方法 1个String类型的 sql 建表命令
            sqLiteDatabase.execSQL(DB_CREATE);
        }

        //重载帮助类onUpdate方法
        //一般在升级的时候被调用
        //删除旧的数据库表 并将数据转移到新版本的数据库表
        //3个参数SQLiteDatabase类型、int i-旧版本号、int i1-新版本号
        @Override
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
            //仅删除原表后建立新表
            sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + DB_TABLE);
            onCreate(sqLiteDatabase);
        }
    }

    //对数据库进行操作的类DBAdapter的构造
    //参数1个 Context类型
    public DBAdapter(Context _context) {
        context = _context;
    }
    //DBAdapter类的open方法
    //抛出异常!!!!
    public void open() throws SQLiteException {
        //帮助类实例化dbOpenHelper需要4个参数
        dbOpenHelper = new DBOpenHelper(context, DB_NAME,
                null, DB_VERSION);

        //调用getWritableDatabase方法
        try {
            db = dbOpenHelper.getWritableDatabase();
        } catch (SQLiteException ex) {
            db = dbOpenHelper.getReadableDatabase();
        }
    }
    //DBAdapter类的close方法
    public void close() {
        if (db != null) {
            db.close();
            db = null;
        }
    }
    //DBAdapter类的insert方法
    //参数1个:数据库储存的类型(本例是People
    public long insert(People people) {
        //用ContentValues类型
        ContentValues newValues = new ContentValues();
        //在put的时候不需要put Key_ID!!!
        newValues.put(KEY_NAME, people.Name);
        newValues.put(KEY_CLASS, people.Class);
        newValues.put(KEY_NUMBER, people.Number);
        //返回值是新数据插入的位置 ID值
        //数据库对象.insert方法
        //参数3个:表名 在null时的替换数据 ContentValues类型需要添加的数据
        return db.insert(DB_TABLE, null, newValues);
    }
    //DBAdapter类的deleteAllData方法
    //无参数
    public long deleteAllData() {
        //返回值是被删除的数据的数量
        //参数3个:表名 删除条件(删除全部数据条件是null)
        return db.delete(DB_TABLE, null, null);
    }
    //DBAdapter类的deleteOneData方法
    //参数1个:long类型的id值
    public long deleteOneData(long id) {
        //返回值是被删除的数据的数量
        //参数3个:表名 删除条件(删除形参给的id)
        return db.delete(DB_TABLE,  KEY_ID + "=" + id, null);
    }
    //DBAdapter类的UpdataOneData方法
    //参数2个:long类型的id值 和 People类型
    public long updateOneData(long id , People people){
        //更新和插入一样用到了ContentValues类型
        ContentValues updateValues = new ContentValues();
        //同样不需要放Key_ID
        updateValues.put(KEY_NAME, people.Name);
        updateValues.put(KEY_CLASS, people.Class);
        updateValues.put(KEY_NUMBER, people.Number);
        //返回值是被更新的数据数量
        //参数4个 表明 ContentValues 更新条件string类型 null
        return db.update(DB_TABLE, updateValues,  KEY_ID + "=" + id, null);
    }
    //private类型
    //DBAdapter类的ConvertToPeople方法
    //参数1个 Cursor类型
    //返回People数组
    //查询需要基于该 ConvertToPeople 方法(应该是自定义方法?)
    @SuppressLint("Range")
    private People[] ConvertToPeople(Cursor cursor){
        //getCount方法返回查询结果总行数
        int resultCounts = cursor.getCount();
        //行数为0||moveToFirst方法返回false返回结果为空
        if (resultCounts == 0 || !cursor.moveToFirst()){
            //该方法返回null
            return null;
        }
        //新建resultCounts个People对象
        People[] peoples = new People[resultCounts];
        //循环 resultCounts次
        for (int i = 0 ; i<resultCounts; i++){
            peoples[i] = new People();
            peoples[i].ID = cursor.getInt(0);
            //根据 列属性索引 得到 属性值
            peoples[i].Name = cursor.getString(cursor.getColumnIndex(KEY_NAME));
            peoples[i].Class = cursor.getString(cursor.getColumnIndex(KEY_CLASS));
            peoples[i].Number = cursor.getString(cursor.getColumnIndex(KEY_NUMBER));
            //游标/指针下移
            cursor.moveToNext();
        }
        //返回People[]
        return peoples;
    }

    //查询操作:
    //DBAdapter类的getOneData方法
    //参数1个:long类型的id值
    public People[] getOneData(long id) {
        //query方法
        //参数7个(6String 1String[]):表名称 属性列-String[] 查询条件
        //查询条件是否使用通配符 分组条件 分组过滤条件 排序方式  后4个全是null
        //返回Cursor类型
        Cursor results =  db.query(DB_TABLE, new String[] { KEY_ID, KEY_NAME, KEY_CLASS, KEY_NUMBER},
                KEY_ID + "=" + id, null, null, null, null);
        //返回People[]
        return ConvertToPeople(results);
    }

    //DBAdapter类的getAllData方法
    public People[] getAllData() {
        //参数查询条件为null  存在5个null
        Cursor results = db.query(DB_TABLE, new String[] { KEY_ID, KEY_NAME, KEY_CLASS, KEY_NUMBER},
                null, null, null, null, null);
        return ConvertToPeople(results);
    }

}
MainActivity.java 
package com.example.exp6;

import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
import android.widget.ArrayAdapter;

public class MainActivity extends AppCompatActivity {
    EditText etc_name,etc_class,etc_id,etc_id2;
    TextView txt_end;
    ListView listView;
    Button btn_add,btn_show,btn_clr,btn_del,btn_del_id,btn_show_id,btn_update_id;

    DBAdapter dbAdapter;
    SQLiteDatabase db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView=findViewById(R.id.list);
        ArrayList<String> data=new ArrayList<String>();
        //数组适配器
        //实例化 参数3个
        ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,data);

        etc_name=findViewById(R.id.etc_name);
        etc_class=findViewById(R.id.etc_class);
        etc_id=findViewById(R.id.etc_id);

        btn_add=findViewById(R.id.btn_add);
        btn_show=findViewById(R.id.btn_show);
        btn_clr=findViewById(R.id.btn_clr);
        btn_del=findViewById(R.id.btn_del);

        btn_del_id=findViewById(R.id.btn_del_id);
        btn_show_id=findViewById(R.id.btn_show_id);
        btn_update_id= findViewById(R.id.btn_update_id);

        etc_id2=findViewById(R.id.etc_id2);
        txt_end=findViewById(R.id.txt_end);

        //处理数据库的类的实例对象
        //参数1个 Context类型
        dbAdapter=new DBAdapter(this);
        //调用DBAdapter对象的 open 方法
        dbAdapter.open();

        btn_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //将文本框中的内容用来创建对象People
                People t=new People();
                t.Name=etc_name.getText().toString();
                t.Class=etc_class.getText().toString();
                t.Number=etc_id.getText().toString();
                //插入一个对象People
                //返回插入的位置id
                long colunm=dbAdapter.insert(t);
                if (colunm == -1 ){
                    txt_end.setText("添加过程错误!");
                } else {
                    txt_end.setText("ID:"+String.valueOf(colunm)+"   姓名:"+
                            t.Name+"   班级:"+t.Class+"   学号:"+t.Number);
                }
            }
        });

        btn_show.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //调用得到数据库中全部的信息
                People [] peoples =dbAdapter.getAllData();
                if (peoples == null){
                    txt_end.setText("数据库中没有数据");
                    return;
                }
                String t="数据库:\n";
                for(int i=0;i<peoples.length;++i){
                    t += peoples[i].toString()+"\n";
                }
                txt_end.setText(t);
            }
        });

        btn_clr.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                txt_end.setText("");
            }
        });

        btn_del.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dbAdapter.deleteAllData();
                txt_end.setText("已删除所有数据!");
            }
        });

        btn_del_id.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int id=Integer.parseInt(etc_id2.getText().toString());
                //返回删除的数据的数量
                //参数要求int类型的
                long result=dbAdapter.deleteOneData(id);
                String msg = "删除ID为"+etc_id2.getText().toString()+"的数据" + (result>0?"成功":"失败");
                txt_end.setText(msg);
            }
        });

        btn_show_id.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int id=Integer.parseInt(etc_id2.getText().toString());
                //查找方法 参数id-int
                //返回值是People[]
                People people[]=dbAdapter.getOneData(id);
                if(people==null){
                    txt_end.setText("Id为"+id+"的记录不存在!");
                }
                else{
                    //因为仅只查找了一条信息 所以是people[0]
                    //并且在People类型中已经重载了函数toString()
                    txt_end.setText("查询成功:\n"+people[0].toString());
                }
            }
        });

        btn_update_id.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int id=Integer.parseInt(etc_id2.getText().toString());
                People t=new People();
                t.Name=etc_name.getText().toString();
                t.Class=etc_class.getText().toString();
                t.Number=etc_id.getText().toString();
                //更新方法
                //参数2个 id-int people类型
                //返回值 被更新的数据数量
                long n=dbAdapter.updateOneData(id,t);
                if (n<0){
                    txt_end.setText("更新过程错误!");
                }else{
                    txt_end.setText("成功更新数据,"+String.valueOf(n)+"条");
                }
            }
        });
    }
    @Override
    protected void onStop() {
        super.onStop();
        dbAdapter.close();
    }
}
结果

数据添加(朱迪&尼克狐尼克)

全部显示 

ID删除 (25-朱迪)

 ID查询 (26)

ID更新 (26) 

全部删除

全部显示 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/946043.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Midjourney技术浅析(七):图像风格化

Midjourney 通过风格迁移&#xff08;Style Transfer&#xff09;和图像滤镜&#xff08;Image Filters&#xff09;技术&#xff0c;使用户能够将生成的图像转换为不同的艺术风格或视觉效果。 一、风格迁移&#xff08;Style Transfer&#xff09; 1.1 风格迁移的定义 风格…

Edge安装问题,安装后出现:Could not find Edge installation

解决&#xff1a;需要再安装&#xff08;MicrosoftEdgeWebView2RuntimeInstallerX64&#xff09;。 网址&#xff1a;https://developer.microsoft.com/zh-cn/microsoft-edge/webview2/?formMA13LH#download 如果已经安装了edge&#xff0c;那就再下载中间这个独立程序安装就…

【JAVA高级篇教学】第六篇:Springboot实现WebSocket

在 Spring Boot 中对接 WebSocket 是一个常见的场景&#xff0c;通常用于实现实时通信。以下是一个完整的 WebSocket 集成步骤&#xff0c;包括服务端和客户端的实现。本期做个简单的测试用例。 目录 一、WebSocket 简介 1. 什么是 WebSocket&#xff1f; 2. WebSocket 的特…

Painter-Mortadela靶场

信息收集 枚举端口 nmap 192.168.109.132 -sS -sV -min-rate 5000 -Pn -p- -p- &#xff1a;扫描所有端口。 (65535)-sS&#xff1a;执行TCP SYN 扫描以快速扫描哪些端口打开。-sC&#xff1a;使用基本识别脚本执行扫描-sV&#xff1a;执行服务扫描–min-rate 5000&#xff1…

攻防世界pwn刷题

get_shell 这题直接给shell了 exp from pwn import* p remote(61.147.171.105,59682) p.sendline(cat flag) p.interactive() cyberpeace{8cd678c722f48327a69b2661ae8956c8} hello_pwn checksec一下 ok&#xff0c;64位的 {alarm(0x3Cu);setbuf(stdout, 0LL);puts("…

1、pycharm、python下载与安装

1、去官网下载pycharm 官网&#xff1a;https://www.jetbrains.com/pycharm/download/?sectionwindows 2、在等待期间&#xff0c;去下载python 进入官网地址&#xff1a;https://www.python.org/downloads/windows/ 3、安装pycharm 桌面会出现快捷方式 4、安装python…

epoll的ET和LT模式

LevelTriggered&#xff1a;简称LT&#xff0c;当FD有数据可读时&#xff0c;会重复通知多次&#xff0c;直至数据处理完成。是epoll的默认模式EdgeTriggered&#xff1a;简称ET&#xff0c;当FD有数据可读时&#xff0c;只通知一次&#xff0c;不管数据是否处理完成 Level是指…

CSS利用浮动实现文字环绕右下角,展开/收起效果

期望实现 文字最多展示 N 行&#xff0c;超出部分截断&#xff0c;并在右下角显示 “…” “更多”&#xff1b; 点击更多&#xff0c;文字展开全部内容&#xff0c;右下角显示“收起”。效果如下&#xff1a; 思路 尽量使用CSS控制样式&#xff0c;减少JS代码复杂度。 利…

单元测试入门和mockup

Java 新手入门&#xff1a;Java单元测试利器&#xff0c;Mock详解_java mock-CSDN博客 这个是典型的before when assert三段式&#xff0c;学一下单测思路 这个没有动态代理&#xff0c;所以是直接class(对比下面) Jmockit使用笔记_增加代码覆盖率_覆盖try catch_使用new Mock…

开发小工具:ping地址

开发小工具&#xff1a;ping地址 import socketdef tcp_port_scan(ip,port):#创建套接字socksocket.socket(socket.AF_INET,socket.SOCK_STREAM)#设置超时sock.settimeout(0.2)try:#发请求result sock.connect_ex((ip,port))if result 0:print(f{ip}--{port}接口连接成功)res…

双汇火腿肠,请勿随意喂猫

在许多家庭中&#xff0c;猫咪作为可爱的宠物成员&#xff0c;备受宠爱。当我们享受着双汇火腿肠的便捷与美味时&#xff0c;或许会有人想到与猫咪分享&#xff0c;但这种看似温馨的举动实则隐藏着诸多问题&#xff0c;双汇火腿肠并不适合喂猫。 从营养成分来看&#xff0c;双…

Unity Excel转Json编辑器工具

功能说明&#xff1a;根据 .xlsx 文件生成对应的 JSON 文件&#xff0c;并自动创建脚本 注意事项 Excel 读取依赖 本功能依赖 EPPlus 库&#xff0c;只能读取 .xlsx 文件。请确保将该脚本放置在 Assets 目录下的 Editor 文件夹中。同时&#xff0c;在 Editor 下再创建一个 Exc…

深信服云桌面系统的终端安全准入设置

深信服的云桌面系统在默认状态下没有终端的安全准入设置&#xff0c;这也意味着同样的虚拟机&#xff0c;使用云桌面终端或者桌面套件都可以登录&#xff0c;但这也给系统带来了一些安全隐患&#xff0c;所以&#xff0c;一般情况下需要设置终端的安全准入策略&#xff0c;防止…

基于SpringBoot的实验室信息管理系统【源码+文档+部署讲解】

系统介绍 视频演示 基于SpringBootVue实现的实验室信息管理系统采用前后端分离的架构方式&#xff0c;系统分为管理员、老师、用户三种角色&#xff0c;实现了用户管理、设备管理、实验室查询、公告、课程、实验室耗材管理、我的等功能 技术选型 开发工具&#xff1a;idea2…

Windows 10 自带功能实现大屏、小屏无线扩展

一、添加可选功能 在作为无线投屏对象的「第二屏」设备上&#xff0c;打开 Windows 10 设置并定位至「应用 > 应用和功能」界面&#xff0c;然后点击右侧界面中的「可选功能」选项。 点击可选功能界面顶部的「添加功能」按钮&#xff0c;搜索「无线显示器」模块并选择添加。…

大电流和大电压采样电路

大电压采样电路&#xff1a; 需要串联多个电阻进行分压&#xff0c;从而一级一级降低电压&#xff0c;防止电阻损坏或者短路直接打穿MCU。 为什么需要加电压跟随器&#xff1a;进行阻抗的隔离&#xff0c;防止MCU的IO阻抗对分压产生影响&#xff1a; 大电流检测电路&#xff…

torch.nn.functional的用法

文章目录 介绍激活函数示例 损失函数示例 卷积操作示例 池化示例 归一化操作示例 Dropout示例 torch.nn.functional 与 torch.nn 的区别 介绍 torch.nn.functional 是 PyTorch 中的一个模块&#xff0c;提供了许多函数式的神经网络操作&#xff0c;包括激活函数、损失函数、卷…

生物信息学软件开发综述学习

目录 ①编程语言和开源工具和库 ②轻量级 R 包开发 ③大规模组学软件开发 ④示例 1.轻量级 R 包开发示例及数据 2.大规模组学软件开发 文献&#xff1a;Bioinformatics software development: Principles and future directions ①编程语言和开源工具和库 在生物信息学…

【复刻】数字化转型是否赋能企业新质生产力发展?(2015-2023年)

参照赵国庆&#xff08;2024&#xff09;的做法&#xff0c;对来自产业经济评论《企业数字化转型是否赋能企业新质生产力发展——基于中国上市企业的微观证据》一文中的基准回归部分进行复刻基于2015-2023年中国A股上市公司数据&#xff0c;实证分析企业数字化转型对新质生产力…

在线免费批量生成 Word 文档工具

为了方便的批量生成 Word 文档&#xff0c;写了个在线 Word 文档批量生成工具&#xff0c;可以根据 Excel 数据和 Word 模板批量生成大量个性化的 Word 文档。适用于需要批量生成格式统一但内容不同的文档场景。比如&#xff1a; 批量生成证书、奖状批量生成合同、协议批量生成…