在Arcgis Pro的工作流中,数据的输入是很常见的。这里以TXT和Excel两种文件为例,在SDK中实现数据的读取和写入。
一、txt文件的读写
txt文件的读写相对简单,可以用Arcgis Pro自带的OpenItemDialog打开txt文件,并直接读取,不需要额外的程序集引用。
1、txt文件内容的读取
下面的例子实现的内容:
通过OpenItemDialog打开指定的txt文件,读取文件第3行的文本,并以消息框提示文本内容。
// 打开文件对话框
OpenItemDialog dlg = new OpenItemDialog()
{
Title = "选择要打开的文本文件",
Filter = ItemFilters.TextFiles,
MultiSelect = false,
};
// 如果用户单击“确定”按钮
if (dlg.ShowDialog() == true)
{
// 获取所选文件的完整路径
string filePath = dlg.Items[0].Path;
// 读取文件的所有行
string[] lines = File.ReadAllLines(filePath, Encoding.Default);
// 如果文件至少有3行
if (lines.Length >= 3)
{
// 获取第3行的内容
string line3 = lines.Length >= 3 ? lines[2] : "该文件不足3行。";
// 显示第3行的内容
MessageBox.Show("第3行的内容是:" + "\r\n" + line3);
}
else
{
// 如果文件不足3行,提示用户
MessageBox.Show("该文件不足3行。");
}
}
2、txt文件内容的写入
下面的例子实现的内容:
通过OpenItemDialog打开指定的txt文件,在文本的第3行后面插入一行标记文本。
// 打开文件对话框
OpenItemDialog dlg = new OpenItemDialog()
{
Title = "选择要打开的文本文件",
Filter = ItemFilters.TextFiles,
MultiSelect = false,
};
// 如果用户单击“确定”按钮
if (dlg.ShowDialog() == true)
{
// 获取所选文件的完整路径
string filePath = dlg.Items[0].Path;
// 读取文件的所有行
string[] lines = File.ReadAllLines(filePath, Encoding.Default);
// 如果文件至少有3行
if (lines.Length >= 3)
{
string insertStr = "标记:这是插入内容!";
// 在第1行后面插入“标记:这是第一行”
lines[2] += $"\r\n{insertStr}";
// 将修改后的内容写回文件
File.WriteAllLines(filePath, lines);
// 显示第3行的内容
MessageBox.Show("在第3行后添加内容:" + $"\r\n{insertStr}");
}
else
{
// 如果文件不足3行,提示用户
MessageBox.Show("该文件不足3行。");
}
}
二、Excel文件的读写
Excel文件的读写会复杂一些,首先,需要保证你的电脑上装有Office的Excel,然后添加(勾选)程序集Microsoft Office x.0 Object Library,版本根据你装的Office版本而定。
然后再添加2行using,准备工作完成。
using Microsoft.Office.Interop.Excel;
using Button = ArcGIS.Desktop.Framework.Contracts.Button;
1、Excel文件内容的读取
下面的例子实现的内容:
由于OpenItemDialog不能筛选Excel文件,所以用OpenFileDialog打开指定的Excel文件。(这里虽然后缀名为xls或xlsx,但是建议用xlsx,可以免去一些保存过程中的麻烦)。
后面就是固定流程:建立Excel应用程序对象,打开Excel文件,获取工作表(第一个表),读取指定单元格内容。
最后关闭Excel文件(不保存)和应用程序对象。
// 定义打开文件对话框
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Excel 文档 (*.xls;*.xlsx)|*.xls;*.xlsx";
openFileDialog.Multiselect = false;
openFileDialog.RestoreDirectory = true;
if (openFileDialog.ShowDialog() == true)
{
// 获取文件路径和名称
string filePath = openFileDialog.FileName;
// 建立 Excel 应用程序对象
Application excelApp = new Application();
// 打开 Excel 文件
Workbook workbook = excelApp.Workbooks.Open(filePath);
// 获取工作表
Worksheet worksheet = workbook.Worksheets[1];
// 读取单元格内容
Microsoft.Office.Interop.Excel.Range range = worksheet.Range["C4"];
string value = range.Value.ToString();
// 关闭 Excel 文件和应用程序对象
workbook.Close(false);
excelApp.Quit();
MessageBox.Show($"C4单元格的内容为:{value}");
}
2、Excel文件内容的写入
下面的例子实现的内容:
用OpenFileDialog打开指定的Excel文件,获取工作表,修改指定单元格内容。
最后关闭Excel文件(保存)和应用程序对象。
// 定义打开文件对话框
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Excel 文档 (*.xls;*.xlsx)|*.xls;*.xlsx";
openFileDialog.Multiselect = false;
if (openFileDialog.ShowDialog() == true)
{
// 获取文件路径和名称
string filePath = openFileDialog.FileName;
// 建立 Excel 应用程序对象
Application excelApp = new Application();
// 打开 Excel 文件
Workbook workbook = excelApp.Workbooks.Open(filePath);
// 获取工作表
Worksheet worksheet = workbook.Worksheets[1];
// 修改单元格的值
worksheet.Range["C4"].Value = "标记内容";
// 保存并关闭 Excel 文件和应用程序对象
workbook.Close(true);
excelApp.Quit();
MessageBox.Show($"C4单元格的内容已被修改!");
}
Excel操作内容比较多,这里只简单介绍了读写操作,其它的删除行、删除列、增加行、增加列、按表名获取表,新建表,合并单元格,取消合并格等,等以后完全研究明白,再单独记一篇笔记。
PS:Office的其它文件,如Word的操作,和Office Excel也比较类似,目前用的不多,就不详述了。
三、工程文件分享
最后,放上工程文件的链接:
RWFilehttps://pan.baidu.com/s/1vdkukUJHtp60ltdIWiiS6w?pwd=235f
PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。