在之前只知道SqlServer支持数据批量插入,殊不知道Oracle、SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解决方法。
首先说一下,IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了。
///
/// 提供数据批量处理的方法。
///
public interface IBatcherProvider : IProviderService
{
///
/// 将
///
/// 要批量插入的
/// 每批次写入的数据量。
void Insert(DataTable dataTable, int batchSize = 10000);
}
一、SqlServer数据批量插入
SqlServer的批量插入很简单,使用SqlBulkCopy就可以,以下是该类的实现:
///
/// 为 System.Data.SqlClient 提供的用于批量操作的方法。
///
public sealed class MsSqlBatcher : IBatcherProvider
{
///
/// 获取或设置提供者服务的上下文。
///
public ServiceContext ServiceContext { get; set; }
///
/// 将
///
/// 要批量插入的
/// 每批次写入的数据量。
public void Insert(DataTable dataTable, int batchSize = 10000)
{
Checker.ArgumentNull(dataTable, "dataTable");
if (dataTable.Rows.Count == 0)
{
return;
}
using (var connection = (SqlConnection)ServiceContext.Database.Create Connection())
{
try
{
connection.TryOpen();
//给表名加上前后导符
var tableName = DbUtility.FormatByQuote(ServiceContext.Databas e.Provider.GetService
using (var bulk = new SqlBulkCopy(connection, SqlBulkCopyOption s.KeepIdentity, null)
{
DestinationTableName = tableName,
BatchSize = batchSize
})
{
//循环所有列,为bulk添加映射
dataTable.EachColumn(c => bulk.ColumnMappings.Add(c.Colum nName, c.ColumnName), c => !c.AutoIncrement);
bulk.WriteToServer(dataTable);
bulk.Close();
}
}
catch (Exception exp)
{
throw new BatcherException(exp);
}
finally
{
connection.TryClose();
}
}
}
}
SqlBulkCopy的ColumnMappings中列的名称受大小写敏感限制,因此在构造DataTable的时候应请注意列名要与表一致。
以上没有使用事务,使用事务在性能上会有一定的影响,如果要使用事务,可以设置https://www.sodocs.net/doc/405045931.html,eInternalTransaction。
二、Oracle数据批量插入
System.Data.OracleClient不支持批量插入,因此只能使用Oracle.DataAccess组件来作为提供者。
///
/// Oracle.Data.Access 组件提供的用于批量操作的方法。
///
public sealed class OracleAccessBatcher : IBatcherProvider
{
///
/// 获取或设置提供者服务的上下文。
///
public ServiceContext ServiceContext { get; set; }
///
/// 将
///
/// 要批量插入的
/// 每批次写入的数据量。
public void Insert(DataTable dataTable, int batchSize = 10000)
{
Checker.ArgumentNull(dataTable, "dataTable");
if (dataTable.Rows.Count == 0)
{
return;
}
using (var connection = ServiceContext.Database.CreateConnection()) {
try
{
connection.TryOpen();
using (var command = ServiceContext.Database.Provider.DbProvid erFactory.CreateCommand())
{
if (command == null)
{
throw new BatcherException(new ArgumentException("comma nd"));
}
command.Connection = connection;
https://www.sodocs.net/doc/405045931.html,mandText = GenerateInserSql(ServiceContext.Da tabase, command, dataTable);
command.ExecuteNonQuery();
}
}
catch (Exception exp)
{
throw new BatcherException(exp);
}
finally
{
connection.TryClose();
}
}
}
///
/// 生成插入数据的sql语句。
///
///
///
///
///
private string GenerateInserSql(IDatabase database, DbCommand comman d, DataTable table)
{
var names = new StringBuilder();
var values = new StringBuilder();
//将一个DataTable的数据转换为数组的数组
var data = table.ToArray();
//设置ArrayBindCount属性
command.GetType().GetProperty("ArrayBindCount").SetValue(command, table.Rows.Count, null);
var syntax = database.Provider.GetService
for (var i = 0; i < table.Columns.Count; i++)
{
var column = table.Columns[i];
var parameter = database.Provider.DbProviderFactory.CreateParamete r();
if (parameter == null)
{
continue;
}
parameter.ParameterName = column.ColumnName;
parameter.Direction = ParameterDirection.Input;
parameter.DbType = column.DataType.GetDbType();
parameter.Value = data[i];
if (names.Length > 0)
{
names.Append(",");
values.Append(",");
}
names.AppendFormat("{0}", DbUtility.FormatByQuote(syntax, column .ColumnName));
values.AppendFormat("{0}{1}", syntax.ParameterPrefix, column.Colu mnName);
command.Parameters.Add(parameter);
}
return string.Format("INSERT INTO {0}({1}) VALUES ({2})", DbUtility.F ormatByQuote(syntax, table.TableName), names, values);
}
}
以上最重要的一步,就是将DataTable转为数组的数组表示,即object[][],前数组的上标是列的个数,后数组是行的个数,因此循环Columns将后数组作为Parameter的值,也就是说,参数的值是一个数组。而insert语句与一般的插入语句没有什么不一样。
三、SQLite数据批量插入
SQLite的批量插入只需开启事务就可以了,这个具体的原理不得而知。
public sealed class SQLiteBatcher : IBatcherProvider
{
///
/// 获取或设置提供者服务的上下文。
///
public ServiceContext ServiceContext { get; set; }
///
/// 将
///
/// 要批量插入的
/// 每批次写入的数据量。
public void Insert(DataTable dataTable, int batchSize = 10000)
{
Checker.ArgumentNull(dataTable, "dataTable");
if (dataTable.Rows.Count == 0)
{
return;
}
using (var connection = ServiceContext.Database.CreateConnection()) {
DbTransaction transcation = null;
try
{
connection.TryOpen();
transcation = connection.BeginTransaction();
using (var command = ServiceContext.Database.Provider.DbProvid erFactory.CreateCommand())
{
if (command == null)
{
throw new BatcherException(new ArgumentException("comma nd"));
}
command.Connection = connection;
https://www.sodocs.net/doc/405045931.html,mandText = GenerateInserSql(ServiceContext.Da tabase, dataTable);
if (https://www.sodocs.net/doc/405045931.html,mandText == string.Empty)
{
return;
}
var flag = new AssertFlag();
dataTable.EachRow(row =>
{
var first = flag.AssertTrue();
ProcessCommandParameters(dataTable, command, row, fir st);
command.ExecuteNonQuery();
});
}
https://www.sodocs.net/doc/405045931.html,mit();
}
catch (Exception exp)
{
if (transcation != null)
{
transcation.Rollback();
}
throw new BatcherException(exp);
}
finally
{
connection.TryClose();
}
}
}
private void ProcessCommandParameters(DataTable dataTable, DbComman d command, DataRow row, bool first)
{
for (var c = 0; c < dataTable.Columns.Count; c++)
{
DbParameter parameter;
//首次创建参数,是为了使用缓存
if (first)
{
parameter = ServiceContext.Database.Provider.DbProviderFactory. CreateParameter();
parameter.ParameterName = dataTable.Columns[c].ColumnName; command.Parameters.Add(parameter);
}
else
{
parameter = command.Parameters[c];
}
parameter.Value = row[c];
}
}
///
/// 生成插入数据的sql语句。
///
///
///
///
private string GenerateInserSql(IDatabase database, DataTable table)
{
var syntax = database.Provider.GetService
var names = new StringBuilder();
var values = new StringBuilder();
var flag = new AssertFlag();
table.EachColumn(column =>
{
if (!flag.AssertTrue())
{
names.Append(",");
values.Append(",");
}
names.Append(DbUtility.FormatByQuote(syntax, column.ColumnNa me));
values.AppendFormat("{0}{1}", syntax.ParameterPrefix, column.C olumnName);
});
return string.Format("INSERT INTO {0}({1}) VALUES ({2})", DbUtility.F ormatByQuote(syntax, table.TableName), names, values);
}
}
四、MySql数据批量插入
///
/// 为 MySql.Data 组件提供的用于批量操作的方法。
///
public sealed class MySqlBatcher : IBatcherProvider
{
///
/// 获取或设置提供者服务的上下文。
///
public ServiceContext ServiceContext { get; set; }
///
/// 将
///
/// 要批量插入的
/// 每批次写入的数据量。
public void Insert(DataTable dataTable, int batchSize = 10000)
{
Checker.ArgumentNull(dataTable, "dataTable");
if (dataTable.Rows.Count == 0)
{
return;
}
using (var connection = ServiceContext.Database.CreateConnection()) {
try
{
connection.TryOpen();
using (var command = ServiceContext.Database.Provider.DbProvid erFactory.CreateCommand())
{
if (command == null)
{
throw new BatcherException(new ArgumentException("comma nd"));
}
command.Connection = connection;
https://www.sodocs.net/doc/405045931.html,mandText = GenerateInserSql(ServiceContext.Da tabase, command, dataTable);
if (https://www.sodocs.net/doc/405045931.html,mandText == string.Empty)
{
return;
}
command.ExecuteNonQuery();
}
}
catch (Exception exp)
{
throw new BatcherException(exp);
}
finally
{
connection.TryClose();
}
}
}
///
/// 生成插入数据的sql语句。
///
///
///
///
///
private string GenerateInserSql(IDatabase database, DbCommand comman d, DataTable table)
{
var names = new StringBuilder();
var values = new StringBuilder();
var types = new List
var count = table.Columns.Count;
var syntax = database.Provider.GetService
table.EachColumn(c =>
{
if (names.Length > 0)
{
names.Append(",");
}
names.AppendFormat("{0}", DbUtility.FormatByQuote(syntax, c.Co lumnName));
types.Add(c.DataType.GetDbType());
});
var i = 0;
foreach (DataRow row in table.Rows)
{
if (i > 0)
{
values.Append(",");
}
values.Append("(");
for (var j = 0; j < count; j++)
{
if (j > 0)
{
values.Append(", ");
}
var isStrType = IsStringType(types[j]);
var parameter = CreateParameter(database.Provider, isStrType, ty pes[j], row[j], syntax.ParameterPrefix, i, j);
if (parameter != null)
{
values.Append(parameter.ParameterName);
command.Parameters.Add(parameter);
}
else if (isStrType)
{
values.AppendFormat("'{0}'", row[j]);
}
else
{
values.Append(row[j]);
}
}
values.Append(")");
i++;
}
return string.Format("INSERT INTO {0}({1}) VALUES {2}", DbUtility.For matByQuote(syntax, table.TableName), names, values);
}
///
/// 判断是否为字符串类别。
///
///
///
private bool IsStringType(DbType dbType)
{
return dbType == DbType.AnsiString || dbType == DbType.AnsiStringFix edLength || dbType == DbType.String || dbType == DbType.StringFixedLength; }
///
/// 创建参数。
///
///
///
///
///
///
///
///
///
private DbParameter CreateParameter(IProvider provider, bool isStrType, D bType dbType, object value, char parPrefix, int row, int col)
{
//如果生成全部的参数,则速度会很慢,因此,只有数据类型为字符串(包含'号)和日
期型时才添加参数
if ((isStrType && value.ToString().IndexOf('\'') != -1) || dbType == DbTy pe.DateTime)
{
var name = string.Format("{0}p_{1}_{2}", parPrefix, row, col);
var parameter = provider.DbProviderFactory.CreateParameter();
parameter.ParameterName = name;
parameter.Direction = ParameterDirection.Input;
parameter.DbType = dbType;
parameter.Value = value;
return parameter;
}
return null;
}
}
MySql的批量插入,是将值全部写在语句的values里,例如,insert batcher(id, name) values(1, '1', 2, '2', 3, '3', ........ 10, '10')。
五、测试
接下来写一个测试用例来看一下使用批量插入的效果。
[Test]
public void TestBatchInsert()
{
Console.WriteLine(TimeWatcher.Watch(() =>
InvokeTest(database =>
{
var table = new DataTable("Batcher");
table.Columns.Add("Id", typeof(int));
table.Columns.Add("Name1", typeof(string));
table.Columns.Add("Name2", typeof(string));
table.Columns.Add("Name3", typeof(string));
table.Columns.Add("Name4", typeof(string));
//构造100000条数据
for (var i = 0; i < 100000; i++)
{
table.Rows.Add(i, i.ToString(), i.ToString(), i.ToString(), i.ToS tring());
}
//获取 IBatcherProvider
var batcher = database.Provider.GetService
if (batcher == null)
{
Console.WriteLine("不支持批量插入。");
}
else
{
batcher.Insert(table);
}
//输出batcher表的数据量
var sql = new SqlCommand("SELECT COUNT(1) FROM Batcher"); Console.WriteLine("当前共有 {0} 条数据
", database.ExecuteScalar(sql));
})));
}
以下表中列出了四种数据库生成10万条数据各耗用的时间
中小学生学籍信息管理系统模板错误如何处理 一、系统提示“不符合模版”如何处理? 如果上传数据模版,系统提示“不符合模板”,说明该模板的格式被改动或者单元格的列、列数据不符合规范,出现此问题请注意以下几点: 1.正常模板中的每一个单元格格式均是“文本”,请用鼠标左键点击Excel最左上一格,然后点击右键,选择“设置单元格格式” 选择“文本” 点击“确定”即可。 2.正常模板中的AU列是隐藏的,目的是为了将学生信息与家庭成员信息隔开,请不要将AU列删除。 3.模板中的各列顺序不要随意改动。 4.如果模板中的数据是从其他地方复制粘贴过来的,请注意粘贴的时候不要带格式,具体操作以office2010为例,点击鼠标右键选择“选择性粘贴”下的“值”。 5.模板中的“上下学距离”不要填写任何单位,默认单位为千米(公里),全部填写数字,并且精确到小数点后一位,如1千米(公里)要写成1.0。 6.模板中“出生地行政区划代码”、“户口所在地行政区划”、“成员1户口所在地行政区划”、“成员2户口所在地行政区划”均填写6位行政区划代码后加6个0,共12位。如:长春市二道区的6位行政区划代码为220105,那么填写的时候应该填写220105000000。
7.模板中需要填写数字的列,例如:电话号码一类的信息不要填写“无”等文字,确保所填入的电话号码为纯数字,即使区号与电话号码之间也不要添加“-”等任何符号。 8.若以上操作仍然提示“不符合模板”,请重新在系统中下载模版,选取一条真实的学生学籍数据,手动逐列填写,然后导入系统,如果成功,那么将其它所有数据按照以上规范填写到模版。 二、学生信息录入以后显示“未查重”如何处理? 该学籍系统是1小时自动查重一次,因此数据导入或录入以后,要在1小时后,状态转为“已查重”,才可以审核、上报操作。 三、模板导入后处理结果为“待处理”该怎么办? 说明该模板正在进行数据排队,等待导入省级数据库,请耐心等候。正常情况下24小时内均可处理完毕,如果超过此时间,请逐级上报进行处理。 四、模板导入后处理结果为“失败”该怎么办? 如果显示为“失败”,说明模板中部分数据填写有误,点击上传失败的文件名,系统以列表的形式显示在模板文件中的哪一行,哪个数据项填写不规范或者填写错误,只需在模板中修改对应出错的数据,再重新导入一次即可。部分学校同一班级的信息未检查准确就多次上传,会增加系统无谓的审核量和各学校的等待处理时间,建议上传前仔细审核、检查模版数据,找到问题所在,排除问题后再上传。 五、模板导入时提示“数据重复”如何处理? 系统提示“数据重复”时,会显示具体是哪行数据重复,重复条件为5个字段:学校标识码、姓名、性别、出生日期、身份证号码。应在模版中删除重复的学籍数据,导入即可。 如果学籍数据确实未上传至系统,且上传时提示“数据重复”,若是小规模数据,请放弃使用模板,在系统中直接手工录入。若是大规模数据,请将情况逐级上报上级教育主管部门进行处理。 六、请问学校导入数据后能修改吗? 学校没有审核、查重的前提下学生信息在系统中可以进行修改;学校审核上报后,所辖教育局审核后,修改(维护)流程如下:
竭诚为您提供优质文档/双击可除word表格批量插入图片 篇一:word20xx中批量快速插入图片技巧 word20xx中批量快速插入图片技巧 我们知道,对于某些特定的字符,可以通过“自动更正”的方法实现快速替换,其实图片也是可以自动更正的,这在需要经常调用某些图片时相当实用,这样就不需要每次逐个手工插入了。这里以word20xx为例进行说明,让你在输入“1”、“2”这些数字时,能够自动替换为相关的图片(例如频繁出现的公司logo图片等)。 首先将相关的图片插入到word文档的窗口中,然后按下“ctrl+c”组合键将它们复制到剪贴板中备用。这一步至关重要,否则下面的操作将无法正常完成。 接着单击office按钮打开“word选项”对话框,然后切换到“校对”选项卡,在这里你会发现一个“自动更正选项”的按钮,单击后即可打开如图所示的对话框,在“替换”后面的文本框中输入图片名称“1”。此时我们会发现原来右下角的“添加”按钮已经可以正常使用,接下来直接单击“添加”按钮,添加图片就可以了。
需要提醒的是,如果前面的步骤没有进行的话,那么即使在“替换”下面的文本框中输入了相关的字符,也会看到“添加”按钮仍然呈现不可用的灰色状态。 按照类似的步骤,你可以继续添加常用的图片到其他自动更正的项目,以后插入相关图片时就方便多了(虽然“替换为”文本框中没有任何反应,而且确认后“替换为”一列也只是显示为“*”号,但这只是显示的问题)。 以后,当我们在word文档中输入1、2这样的数字时,按下回车键后,相关的图片就会自动出现在word文档中,大大提高了工作效率。 20xx-07-27来源:it168 篇二:word与excel连接邮件合并批量插入照片 word与excel数据连接邮件合并批量照片自动插入方法 一、建立“照片名”的excel数据文件 1.建立文件夹:在d盘根目录下建立名为:yjhebing的文件夹,在这个文件夹里面在建立一个名为:zhaopianku的文件夹,所有照片放在zhaopianku的文件夹(word表格批量插入图片)里面 图-1:zhaopianku文件夹 2.开始——运行——输入cmd,按回车键,打开dos命令框。输入d:按回车建 再输入:cdyjhebing按回车键,再输入:cdzhaopianku
雨课堂试卷批量导入模板 试卷标题:计算机基础知识 一、单选题 1.第一台电子计算机ENIAC诞生于()年。正确答案:C A. 1927 B. 1936 C. 1946 D. 1951 [解析] 第一台电子计算机ENIAC诞生于1946年。 2.与传播计算机“病毒”无关的是()。 A. 键盘 B. 网络 C. 硬盘 D. U盘 正确答案:A [解析]网络可以传播计算机病毒,硬盘和U盘都可以感染计算机病毒。 3.计算机的软件系统分为()。正确答案:C A. 程序和数据 B. 工具软件和测试软件 C. 系统软件和应用软件 D. 系统软件和测试软件 4.计算机系统是由()组成的。正确答案:D A. 主机及外部设备 B. 主机键盘显示器和打印机 C. 系统软件和应用软件 D. 硬件系统和软件系统 5.能描述计算机的运算速度的是()。正确答案:B A. 二进制位 B. MIPS C. MHz D. MB 二、多选题(每题2分) 1.微处理器又称为中央处理器,它是由(AB )组成的。 A.运算器B.控制器C.存储器D.寄存器 [解析] 中央处理器由运算器和控制器组成,运算器中包含寄存器。 2.属于应用软件的是()。正确答案:BCD A. Windows B. Word C. WPS D. PhotoShop 3.与传播计算机“病毒”有关的是()。 A. 网络 B. 键盘 C. 硬盘 D. 移动硬盘 正确答案:ACD 4.第一台电子计算机ENIAC诞生于()年。正确答案:C A. 1927 B. 1936 C. 1946 D. 1951 5.下列说法中不正确的是(ABCD)。 A.ROM 是只读存储器,其中的内容只能读一次,下次再读就读不出来了 B.硬盘通常安装在主机箱内,所以硬盘属于内存 C.CPU 不能直接与外部存储器打交道 D.任何存储器都有记忆能力,即其中的信息不会丢失 三、填空题 1.计算机由(运算器)、(控制器)、(存储器)、输入设备和输出设备组成。 2.CPU的中文意义是(中央处理单元| 中央处理器)。 备注:此题双答案,导入后需在雨课堂试卷中修改答案1为:“中央处理单元”,增加答案2:“中央处理器”。 3.1GB=(1024)MB,1MB=(1024)KB
给Word快速插入常用图片技巧 系统下载打开Word2007,先插入一张公司标志图片,并调整好适当尺寸。再选中插入的图片,单击Office 按钮,选择“Word选项”。在“Word选项”窗口中选择“校对”,单击“自动更正选项”按钮。在“自动更正”窗口的“替换”输入框中输入“公标1”,单击“添加”按钮后(如图1),确定返回。以后不管在哪个文档中你只要输入“公标1”后再继续输入,“公标1”就会自动变成公司标志的图片。 图1 在此,“替换为”一项后面不用输入,Word默认会把选中内容当成替换为内容,只是当选中的是图片时“替换为”中会显示成空白,但其实已经有图片在里面了。此外,自动更正可以设置的对象不仅限于图片,还包括文字的格式和表格。你甚至可以同时选中包括图片、表格、文字等多种对象的内容进行设置。此招最大的缺点就是只能对“文字环绕”格式为“嵌入型”的图片有效,也只能插入“嵌入型”的图片。 文档部件,用鼠标插入图片 在Word2007中也可把常用图片保存成文档部件,即可通过鼠标单击选择快速插入常用图片。其优点是比较直观,操作上更顺手,而且对图片没有任何格式限制。 在Word文档选中一张图片(例:公司标志图),切换到“插入”选项卡,单击“文档部件”,选择“将所选内容保存到文档部件库”。在“新建构件基块”窗口中输入“名称”,比如“公标1”(如图2),确定后完成设置。以后编辑时,只要单击“插入”选项卡的“文档部件”即可在下拉列表中找到添加的公司标志图,单击选择即可插入。
图2 设置后关闭Word会提示是否保存到Building Blocks.dotx文档,此时一定要选择“是”。这招对图片、表格、文字等对象也同样有效。其缺点是不适合用键盘输入,而且当添加太多文档部件后比较难找到需要图片,反而不容易输入了。 录制宏,用快捷键插入图片 通过录制宏可以用快捷键插入常用图片,也可以把图片直接添加到快速工具栏上通过鼠标单击插入,兼具前两招的效果。由于可在工具栏上显示插入图片按钮,用鼠标插入图片时要比文档部件更方便,对图片格式也没有任何限制。适于插入少数特别常用的图片,比如公章、签名等等。另一优点是对原图进行修改后,下次插入的就是修改后的新图,无需重复设置,因此也适于插入经常修改的图片。 打开Word2007,切换到“视图”选项卡,单击“宏”选择“录制宏”。在“录制宏”对话框输入宏名为“公标1”,单击下面的“键盘”按钮。在弹出“自定义键盘”窗口中按下你要设置的快捷键“Alt+Ctrl+B”(如图3),单击“指定”按钮添加到“当前快捷键”列表中,“关闭”窗口返回Word。此时Word的状态栏会显示停止录制宏的图标“■”,鼠标指针也多了个录音带图标。
学生体质健康数据上报教程 一:进入学生体质健康网:可以通过百度搜索或输入网址 二:进入登入页面:输入去年注册的用户名和密码(进去之后填写基本信息和重置密码)
三、学校基本信息设置:如有变化,请调整 四、年级班级管理:可用网站上的模板批量用模板导入,也可一个年级一个年级操作。班级名称可以用统一的写一(1)班、一(2)班这样的形式(后面类推),班级编号可用1101、1102编辑【后面根据年级和班级类推,五(2)班即为1502】
此表格为我校一(1)班学生基本信息表格中的数据,请大家关注班级编号和班级名称 注意:设置班级名称和班级编号后,后期所填的表格这两样数据必须要跟之前的一样,即年级班级管理、学生基本信息、学生体质成绩三份数据中的班级名称和班级编号要完全一样,否则数据导不进去。至于学生学号,可酌情自行设定,我是以入学年份(2013)+加班级编号(01)+号码(01)即20130101这样的方式进行编排。 五、班级管理:单一导入操作:点击新增班级后,输入班级名称和班级编号---和表格中的必须一致(不要出现下列情况,班级名称和班级编号跟年级对不上,否则会出现导不进去的现象)
六、测试项目设置:必测项目不需要设置,只需设置选测项目 七、测试环境信息导入:建议采用模板导入,可复制,操作起来较快,注意日期用统一格式,2013-10-10 完成“学校基本信息”这一大栏,设置之后,接下来进行“学生体测数据管理”一栏的操作 八、导入学生基本信息--下载模板,按照要求提示将一个班级的信息复制到表中完成一个班级后,记得进行重命名,如“一(1)班学生基本信息”,最后可将所有学生的基本信息放入一个文件夹进行存放。注:小学可不用输身份证和来源。
如何在EXCEL表格中批量插入对应图片学生照片用身份证号命名后,核对是个麻烦事儿,有了这个表格就直观多了。 制作过程如下: 1、粘贴学生信息、输入公式并向下填充 在D2单元格输入公式(复制下面的公式并粘贴到D2单元格中): ="