热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

读取shp属性表导出为excel表格和写入word文档

最近做了一些读取shp属性表另存为excel表格和写入word文档的小事情,把思路和代码记下来,以备以后查看,各位大神看到请绕道,高抬贵手 条件如下:必备一个word文档,且里面必

最近做了一些读取shp属性表另存为excel表格和写入word文档的小事情,把思路和代码记下来,以备以后查看,各位大神看到请绕道,高抬贵手《读取shp属性表导出为excel表格和写入word文档》

 条件如下:必备一个word文档,且里面必须有一张空表,假如我只需要读取shp属性表的两个字段:City(市名)和affcountyN(受灾县数量)

具体代码如下:

 public class Helper
    {

     public bool Execute(string excelPath, string docPath, string shpPath, out string message)
        {

            return ExecuteEX(excelPath, docPath, shpPath, out message);
        }
      
        ///


        /// 执行函数
        ///

        /// excel路径
        /// 文档路径
        /// shp文件路径
        ///
        private bool ExecuteEX(string excelPath, string docPath, string shpPath, out string message)
        {
            try
            {
                if (!judgeInOrOutFile(excelPath, docPath, shpPath))
                {
                    message = “文件输入不正确!”;
                    return false;
                }
                //判断excel文件是否存在,若存在删除
                if (File.Exists(excelPath))
                {
                    File.Delete(excelPath);
                }
                string docResultPath = Path.Combine(Path.GetDirectoryName(docPath), “data.doc”);
                //判断doc文件是否存在,若存在删除
                if (File.Exists(docResultPath))
                {
                    File.Delete(docResultPath);
                }
                //拷贝一份word文档
                File.Copy(docPath, docResultPath);
                //打开shp
                string folder = Path.GetDirectoryName(shpPath);
                IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass();
                IFeatureWorkspace pWS = (IFeatureWorkspace)pWSF.OpenFromFile(folder, 0);
                IFeatureClass pFeatureClass = pWS.OpenFeatureClass(Path.GetFileNameWithoutExtension(shpPath));

                //获得shp属性表并创建dataTable
                IFeatureCursor featureCursor = pFeatureClass.Search(null, false);
                IFeature feature = featureCursor.NextFeature();
                DataTable dt = NewDataTable();
                string value = null;
                while (feature != null)
                {
                    //新建行
                    DataRow dr = dt.NewRow();
                    //从shp属性表中获得city属性
                    value = feature.get_Value(pFeatureClass.FindField(“City”)).ToString();
                    //转换为汉字
                    string strvalue = GetVlue(value);
                    //赋值
                    dr[“City”] = strvalue;
                    value = feature.get_Value(pFeatureClass.FindField(“affcountyN”)).ToString();
                    dr[“affcountyN”] = Math.Round(TODouble(value), 2);
                    //datatable添加此行
                    dt.Rows.Add(dr);
                    feature = featureCursor.NextFeature();
                }
                //创建一个wordApplication
                WordOper wordOper = new WordOper();
                wordOper.OpenAndActive(docResultPath, false, false);
                //表格赋值
                wordOper.TableValue(dt);
                wordOper.Save();
                wordOper.Close();

                //改变表格列名
                dt.Columns[“City”].ColumnName = “地区”;
                dt.Columns[“affcountyN”].ColumnName = “直接经济损失(万元) “;
                //另存表格
                ExcelOper excel = new ExcelOper();

                Hashtable hashTable = new Hashtable();
                hashTable.Add(“直接经济损失分布产品”, dt);
                bool issucess = false;
                if (excel.WriteExcel(excelPath, hashTable, out message))
                {
                    message = “数据生成成功!”;
                    issucess = true;
                }
                else
                {
                    message = “统计数据生成失败!”;
                    issucess = false;
                }
                return issucess;
            }
            catch (Exception ex)
            {
                message = “失败!”;
                return false;
            }
        }
        ///


        /// 新建datatable
        ///

        /// 返回datatable
        private DataTable NewDataTable()
        {
            //新建datatable
            DataTable dt = new DataTable();
            //新建列
            DataColumn dCol = null;
            dCol = new DataColumn();
            // 指定列名和类型
            dCol.ColumnName = “City”;
            dCol.DataType = typeof(string);
            dt.Columns.Add(dCol);

            dCol = new DataColumn();
            dCol.ColumnName = “affcountyN”;
            dCol.DataType = typeof(double);
            //  datatable添加列
            dt.Columns.Add(dCol);
            return dt;
        }

        ///


        /// 判断输入输出格式是否正确
        ///

        /// excel路径
        /// 文档路径
        /// shp文件
        ///
        private bool judgeInOrOutFile(string excelPath, string docPath, string shpPath)
        {
            //判断excel文件名称是否正确,不正确则运行失败
            if (!excelPath.EndsWith(“.xls”) && !excelPath.EndsWith(“.xlsx”))
            {
                MessageBox.Show(excelPath + “表格名称输入不正确!”);
                return false;
            }
            //判断doc文件名称是否正确,不正确则运行失败
            if (!File.Exists(docPath))
            {
                MessageBox.Show(docPath + “不存在!”);
                return false;
            }
            //判断shp文件是否存在,不存在则运行失败
            if (!File.Exists(shpPath))
            {
                MessageBox.Show(shpPath + “不存在!”);
                return false;
            }
            return true;
        }
        ///
        /// string 转换为double
        ///

        /// string 值
        ///
        private double TODouble(string value)
        {
            try
            {
                double number = Convert.ToDouble(value);
                return number;
            }
            catch (Exception ex)
            {
                return 0;
            }
        }
        ///
        /// 转换为汉字
        ///

        ///
        ///
        private string GetVlue(string name)
        {
            byte[] temp = Encoding.GetEncoding(“ISO8859-1”).GetBytes(name);
            string value2 = Encoding.Default.GetString(temp);
            return value2;
        }
     }

word文档代码:

  public class WordOper
    {

        #region 私有成员

        private Microsoft.Office.Interop.Word.ApplicationClass _wordApplication;
        private Microsoft.Office.Interop.Word.Document _wordDocument;
        object missing = System.Reflection.Missing.Value;

        #endregion

        #region  公开属性

        ///


        /// ApplciationClass
        ///

        public Microsoft.Office.Interop.Word.ApplicationClass WordApplication
        {
            get
            {
                return _wordApplication;
            }
        }

        ///


        /// Document
        ///

        public Microsoft.Office.Interop.Word.Document WordDocument
        {
            get
            {
                return _wordDocument;
            }
        }

        #endregion

        #region  构造函数

        public WordOper()
        {
            _wordApplication = new Microsoft.Office.Interop.Word.ApplicationClass();
        }

        public WordOper(Microsoft.Office.Interop.Word.ApplicationClass wordApplication)
        {
            _wordApplication = wordApplication;
        }

        #endregion

        #region 基本操作(新建、打开、保存、关闭)

        ///


        /// 打开指定文件
        ///

        /// 文件名(包含路径)
        /// 打开后是否只读
        /// 打开后是否可视
        /// 打开是否成功
        public bool OpenAndActive(string FileName, bool IsReadOnly, bool IsVisibleWin)
        {
            if (string.IsNullOrEmpty(FileName))
            {
                return false;
            }
            try
            {
                _wordDocument = OpenOneDocument(FileName, missing, IsReadOnly, missing, missing, missing, missing, missing, missing, missing, missing, IsVisibleWin, missing, missing, missing, missing);
                _wordDocument.Activate();
                return true;
            }
            catch
            {
                return false;
            }
        }

        ///


        /// 关闭
        /// Closes the specified document or documents.
        ///

        public void Close()
        {
            if (_wordDocument != null)
            {
                //垃圾回收
                _wordDocument.Close(ref missing, ref missing, ref missing);
                ((Microsoft.Office.Interop.Word._Application)_wordApplication).Application.Quit(ref missing, ref missing, ref missing);
                GC.Collect();
            }
        }

        ///


        /// 保存
        ///

        public void Save()
        {
            if (_wordDocument == null)
            {
                _wordDocument = _wordApplication.ActiveDocument;
            }
            _wordDocument.Save();
        }

        ///


        /// 打开一个已有文档
        ///

        ///
        ///
        ///
        ///
        ///
        ///
        ///
        ///
        ///
        ///
        ///
        ///
        ///
        ///
        ///
        ///
        ///
        public Microsoft.Office.Interop.Word.Document OpenOneDocument(object FileName, object ConfirmConversions, object ReadOnly,
            object AddToRecentFiles, object PasswordDocument, object PasswordTemplate, object Revert,
            object WritePasswordDocument, object WritePasswordTemplate, object Format, object Encoding,
            object Visible, object OpenAndRepair, object DocumentDirection, object NoEncodingDialog, object XMLTransform)
        {
            try
            {
                return _wordApplication.Documents.Open(ref FileName, ref ConfirmConversions, ref ReadOnly, ref AddToRecentFiles,
                    ref PasswordDocument, ref PasswordTemplate, ref Revert, ref WritePasswordDocument, ref WritePasswordTemplate,
                    ref Format, ref Encoding, ref Visible, ref OpenAndRepair, ref DocumentDirection, ref NoEncodingDialog, ref XMLTransform);
            }
            catch
            {
                return null;
            }
        }
        #endregion

        #region 查找、替换

        ///


        /// 在文档中写表格
        ///

        ///
        ///
        public bool TableValue(System.Data.DataTable dt)
        {
            try
            {
                Table table = _wordDocument.Tables[1];
                if (table.Rows.Count == 1)
                    table.Rows.Add(missing);
                for (int col = 1; col                 {
                    for (int row = 0; row                     {
                        table.Cell(row + 2, col).Range.Text = dt.Rows[row][col].ToString();
                        if (row != dt.Rows.Count – 1)
                            table.Rows.Add(missing);
                    }
                }
                return true;
            }
            catch
            {
                return false;
            }
        }

        #endregion
    }

excel相关代码:

    public class ExcelOper
    {
        private Application _excelApp = null;
        public ExcelOper()
        {

        }

        #region 写Excel

        ///


        /// 创建Excel进程
        ///

        ///
        private Application GetExcelApp()
        {
            Application excelApp = new Application();
            excelApp.Application.Workbooks.Add(true);
            _excelApp = excelApp;

            return excelApp;
        }

        ///


        /// 把DataTable的内容写入Excel
        ///

        /// excel文件的路径
        /// key:sheetName,value:DataTable
        ///
        public bool WriteExcel(string strExcelPath, Hashtable htDataTable, out string message)
        {
            if (htDataTable == null || htDataTable.Count == 0)
            {
                message = “数据表为空”;
                return false;
            }

            bool writeRst = false;
            try
            {
                if (_excelApp == null)
                {
                    GetExcelApp();
                }

                //依次写入Sheet页
                int countNum = 1;
                foreach (DictionaryEntry de in htDataTable)
                {
                    string sheetName = de.Key.ToString();
                    System.Data.DataTable dtTable = (System.Data.DataTable)de.Value;

                    Worksheet excelSheet = null;
                    if (countNum == 1)
                    {
                        excelSheet = (Worksheet)_excelApp.Worksheets[countNum];
                    }
                    else
                    {
                        excelSheet = (Worksheet)_excelApp.Worksheets.Add(Type.Missing, Type.Missing, 1, Type.Missing);
                    }
                    excelSheet.Name = sheetName;
                    bool sheetRst = writeSheet(excelSheet, dtTable);
                    if (!sheetRst)
                    {
                        throw new Exception(sheetName + “创建失败!”);
                    }
                    countNum++;
                }

                //保存
                _excelApp.Visible = false;
                _excelApp.DisplayAlerts = false;
                _excelApp.AlertBeforeOverwriting = false;
                _excelApp.ActiveWorkbook.SaveAs(strExcelPath, Type.Missing, null, null, false, false,
                                                    XlSaveAsAccessMode.xlNoChange, null, null, null, null, null);
                message = “数据输出成功!”;
                writeRst = true;
            }
            catch (Exception ex)
            {
                message = ex.Message;
                //LogHelper.Error.Append(ex);
                writeRst = false;
            }
            finally
            {
                //关闭Excel进程
                object missing = System.Reflection.Missing.Value;
                _excelApp.ActiveWorkbook.Close(missing, missing, missing);
                _excelApp.Quit();
                _excelApp = null;

                //垃圾回收
                GC.Collect();
            }

            return writeRst;
        }
        ///


        /// 写Sheet页
        ///

        ///
        ///
        ///
        private bool writeSheet(Worksheet excelSheet, System.Data.DataTable dtTable)
        {
            if (excelSheet == null || dtTable == null)
            {
                return false;
            }

            //列名
            for (int i = 0; i             {
                DataColumn dtColumn = dtTable.Columns[i];
                string caption = dtColumn.Caption;
                excelSheet.Cells[1, i + 1] = caption;
            }

            //写入值
            for (int i = 0; i             {
                for (int j = 0; j                 {
                    object objValue = dtTable.Rows[i][j];
                    excelSheet.Cells[2 + i, j + 1] = objValue;
                }
            }

            excelSheet.Columns.AutoFit();
            return true;
        }
        #endregion

    }


推荐阅读
  • 本文详细介绍了如何使用C#实现不同类型的系统服务账户(如Windows服务、计划任务和IIS应用池)的密码重置方法。 ... [详细]
  • 本文详细介绍了在Luat OS中如何实现C与Lua的混合编程,包括在C环境中运行Lua脚本、封装可被Lua调用的C语言库,以及C与Lua之间的数据交互方法。 ... [详细]
  • C# 中创建和执行存储过程的方法
    本文详细介绍了如何使用 C# 创建和调用 SQL Server 存储过程,包括连接数据库、定义命令类型、设置参数等步骤。 ... [详细]
  • pypy 真的能让 Python 比 C 还快么?
    作者:肖恩顿来源:游戏不存在最近“pypy为什么能让python比c还快”刷屏了,原文讲的内容偏理论,干货比较少。我们可以再深入一点点,了解pypy的真相。正式开始之前,多唠叨两句 ... [详细]
  • Java多线程售票案例分析
    本文通过一个售票系统的实例,深入探讨了Java中的多线程技术及其在资源共享和并发控制中的应用。售票过程涉及查询、收款、找零和出票等多个步骤,其中对总票数的管理尤为关键。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • D17:C#设计模式之十六观察者模式(Observer Pattern)【行为型】
    一、引言今天是2017年11月份的最后一天,也就是2017年11月30日,利用今天再写一个模式,争取下个月(也就是12月份& ... [详细]
  • 基于SSM框架的在线考试系统:随机组卷功能详解
    本文深入探讨了基于SSM(Spring, Spring MVC, MyBatis)框架构建的在线考试系统中,随机组卷功能的设计与实现方法。 ... [详细]
  • 深入解析 C++ 中的 String 和 Vector
    本文详细介绍了 C++ 编程语言中 String 和 Vector 的使用方法及特性,旨在帮助开发者更好地理解和应用这两个重要的容器。 ... [详细]
  • 尽管在WPF中工作了一段时间,但在菜单控件的样式设置上遇到了一些基础问题,特别是关于如何正确配置前景色和背景色。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • IO流——字符流 BufferedReader / BufferedWriter 进行文件读写
    目录节点流、处理流读文件:BufferedReader的使用写文件:BufferedWriter的使用节点流处理流节点流和处理流的区别和联系字符流Buf ... [详细]
author-avatar
linxin66063
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有